varias not multiple equal ejemplos columns columnas sql sql-server coldfusion cfml

not - sql distinct varias columnas



Seleccione una columna DISTINCT SQL (11)

Como señaló John Fiala, la respuesta canónica en SQL Server es usar una cláusula group by cuando se desea realizar una operación "distinta" sobre un subconjunto de columnas. ¿Por qué es esta la respuesta canónica correcta? Bueno, desea obtener columnas que no sean parte de su grupo "distinto". ¿Exactamente qué filas desea obtener para estas columnas subsidiarias? El uso de una cláusula group by y la definición de funciones agregadas para estas columnas subsidiarias hace que su consulta se comporte correctamente en el sentido de que ahora sabe cómo se obtienen estas columnas subsidiarias. Este artículo proporciona más detalles:

http://weblogs.sqlteam.com/jeffs/archive/2007/10/12/sql-distinct-group-by.aspx

SELECT value_rk, MIN(value) as value, MIN(attribute_definition_id) as attribute_definition_id FROM attribute_values GROUP BY value_rk

Además, vale la pena señalar que MIN y MAX trabajan en texto y muchos otros tipos de datos que no son valores numéricos.

Agregado: Trabajar con SQL Server 2000 y 2005, por lo que tiene que funcionar en ambos. Además, value_rk no es un número / entero (Error: el identificador único del tipo de datos del operando no es válido para el operador mínimo)

¿Hay alguna manera de hacer una coincidencia "DISTINCT" de una sola columna cuando no me importan las otras columnas devueltas? Ejemplo:

**Table** Value A, Value L, Value P Value A, Value Q, Value Z

Necesito devolver solo una de estas filas en base a lo que está en la primera (Valor A). Todavía necesito resultados de la segunda y la tercera columna (la segunda debería coincidir en todos los ámbitos, pero la tercera es una clave única, de la que necesito al menos uno).

Esto es lo que tengo hasta ahora, aunque obviamente no funciona:

SELECT value, attribute_definition_id, value_rk FROM attribute_values WHERE value IN ( SELECT value, max(value_rk) FROM attribute_values ) ORDER BY attribute_definition_id

Estoy trabajando en ColdFusion, así que si hay una solución simple es que estoy abierto a eso también. Estoy tratando de limitar o "agrupar por" la primera columna "valor". value_rk es mi gran problema ya que cada valor es único, pero solo necesito uno.

NOTA: value_rk no es un número, por lo tanto, esto NO FUNCIONA

ACTUALIZACIÓN: Tengo una versión que funciona, es probablemente bastante más lenta que una versión pura de SQL, pero sinceramente, cualquier cosa que trabaje en este punto es mejor que nada. Toma los resultados de la primera consulta, realiza una segunda consulta, excepto limitar los resultados a uno, y toma una value_rk correspondiente para el valor que coincida. Al igual que:

<cfquery name="queryBaseValues" datasource="XXX" timeout="999"> SELECT DISTINCT value, attribute_definition_id FROM attribute_values ORDER BY attribute_definition_id </cfquery> <cfoutput query="queryBaseValues"> <cfquery name="queryRKValue" datasource="XXX"> SELECT TOP 1 value_rk FROM attribute_values WHERE value = ''#queryBaseValues.value#'' </cfquery> <cfset resourceKey = queryRKValue.value_rk> ...

Así que ahí lo tienes, seleccionando una sola columna claramente en ColdFusion. Cualquier sugerencia pura de SQL Server 2000/2005 es muy bienvenida :)


De acuerdo, aquí están mis suposiciones:

Servidor SQL estándar

value_rk no es un valor numérico, pero el valor y attribute_definition_id son numéricos.

SELECT value_rk, MIN(value) as value, MIN(attribute_definition_id) as attribute_definition_id FROM attribute_values GROUP BY value_rk ORDER BY MIN(attribute_definition_id)

Si uno de esos campos no es numérico, requerirá más reflexión, por favor avísenos.


Es esto lo que estás buscando?

SELECT value, attribute_definition_id, value_rk FROM attribute_values av1 WHERE value_rk IN ( SELECT max(value_rk) FROM attribute_values av2 WHERE av2.value = av1.value ) ORDER BY attribute_definition_id

Si value_rk es único, esto debería funcionar.


Esto debería funcionar para PostgreSQL, no sé qué dbms usas.

SELECT DISTINCT ON (value) value, attribute_definition_id, value_rk FROM attribute_values ORDER BY value, attribute_definition_id

Documentos de PostgreSQL


Menos elegante de lo que me gustaría ---- es esencialmente lo que estás haciendo, solo en SQL puro --- pero funciona y todo se puede hacer en SQL.

DECLARE @mytable TABLE(mykey NVARCHAR(512), myVal NVARCHAR(512)) DECLARE @keyVal NVARCHAR(512) DECLARE @depVal NVARCHAR(512) DECLARE myCursor CURSOR for SELECT DISTINCT(value) FROM attribute_values OPEN myCursor FETCH NEXT FROM myCursor INTO @keyVal WHILE @@FETCH_STATUS=0 BEGIN SET @depVal = (SELECT TOP 1 attribute_definition_id FROM attribute_values WHERE VALUE=@keyVal ORDER BY attribute_definition_id) INSERT INTO @mytable (mykey, myVal) VALUES (@keyVal, @depVal) FETCH NEXT FROM myCursor INTO @keyVal END DEALLOCATE myCursor SELECT * FROM @mytable

Puede agregar un depVal2 y otros usando este método.


No estoy seguro si entiendo completamente tu configuración, pero algo como esto funcionaría:

SELECT value, attribute_definition_id, value_rk FROM attribute_values GROUP BY value ORDER BY attribute_definition_id;

Nuevamente, no estoy seguro de qué columna está tratando de limitar o cómo quiere limitarla.


Si está abierto a usar variables de tabla, puede mantenerlo todo en una sola llamada de base de datos como esta:

DECLARE @attribute_values TABLE (value int, attribute_definition_id int, value_rk uniqueidentifier) INSERT INTO @attribute_values (value) SELECT DISTINCT value FROM attribute_values UPDATE @attribute_values SET attribute_definition_id = av2.attribute_definition_id, value_rk = av2.value_rk FROM @attribute_values av1 INNER JOIN attribute_values av2 ON av1.value = av2.value SELECT value, attribute_definition_id, value_rk FROM @attribute_values

Básicamente, está creando un conjunto de registros limitado con la tabla llena de valores únicos de ''valor'' y dejando que SQL Server llene los espacios utilizando solo una de las coincidencias de la tabla principal.

Editado para agregar: Esta sintaxis funciona perfectamente dentro de cfquery.


creo

SELECT DISTINCT a.value, a.attribute_definition_id, (SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk FROM attribute_values as a ORDER BY attribute_definition_id

trabajó


esto podría funcionar:

SELECT DISTINCT a.value, a.attribute_definition_id, (SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk FROM attribute_values as a ORDER BY attribute_definition_id

.. no probado.


SELECT a1.value, a1.attribute_definition_id, a1.value_rk FROM attribute_values AS a1 LEFT OUTER JOIN attribute_values AS a2 ON (a1.value = a2.value AND a1.value_rk < a2.value_rk) WHERE a2.value IS NULL ORDER BY a1.attribute_definition_id;

En otras palabras, encuentre la fila a1 para la cual no existe la fila a2 con el mismo value y una value_rk mayor.


SELECT value, attribute_definition_id, value_rk FROM attribute_values WHERE value, value_rk IN ( SELECT value, max(value_rk) FROM attribute_values GROUP BY value ) ORDER BY attribute_definition_id

¡NO PROBADO!