transact tablas tabla sqlserver registros misma minus ejemplos ejemplo consultas concatenar comparar coincidentes buscar sql sql-server unique distinct

tablas - SQL-seleccione distinto solo en una columna



sqlserver except (3)

Como no te importa, elegí la ID máxima para cada número.

select tbl.* from tbl inner join ( select max(id) as maxID, number from tbl group by number) maxID on maxID.maxID = tbl.id

Explicación de la consulta

select tbl.* -- give me all the data from the base table (tbl) from tbl inner join ( -- only return rows in tbl which match this subquery select max(id) as maxID -- MAX (ie distinct) ID per GROUP BY below from tbl group by NUMBER -- how to group rows for the MAX aggregation ) maxID on maxID.maxID = tbl.id -- join condition ie only return rows in tbl -- whose ID is also a MAX ID for a given NUMBER

He buscado por todas partes una respuesta a este problema. Estoy usando un servidor SQL de Microsoft, supongo que tengo una tabla que se ve así:

+--------+---------+-------------+-------------+ | ID | NUMBER | COUNTRY | LANG | +--------+---------+-------------+-------------+ | 1 | 3968 | UK | English | | 2 | 3968 | Spain | Spanish | | 3 | 3968 | USA | English | | 4 | 1234 | Greece | Greek | | 5 | 1234 | Italy | Italian |

Quiero realizar una consulta que solo selecciona la columna ''NÚMERO'' única (no importa si la primera o la última fila no me molestan). Entonces esto me daría:

+--------+---------+-------------+-------------+ | ID | NUMBER | COUNTRY | LANG | +--------+---------+-------------+-------------+ | 1 | 3968 | UK | English | | 4 | 1234 | Greece | Greek |

¿Cómo se puede lograr esto?


Un enfoque muy típico para este tipo de problema es usar row_number() :

select t.* from (select t.*, row_number() over (partition by number order by id) as seqnum from t ) t where seqnum = 1;

Esto es más generalizable que usar una comparación con la identificación mínima. Por ejemplo, puede obtener una fila aleatoria usando order by newid() . Puede seleccionar 2 filas usando where seqnum <= 2 .


Utilizará la siguiente consulta:

SELECT * FROM [table] GROUP BY NUMBER;

Donde [table] es el nombre de la tabla.

Esto proporciona una lista única para la columna NUMBER , sin embargo, las otras columnas pueden carecer de sentido según la implementación del proveedor; lo que quiere decir que no pueden corresponder juntas a una fila o filas específicas.