SQL - выберите только один столбец
Я искал по всему миру ответ на эту проблему. Я использую Microsoft SQL Server, предположим, что у меня есть таблица, которая выглядит так:
+--------+---------+-------------+-------------+
| ID | NUMBER | COUNTRY | LANG |
+--------+---------+-------------+-------------+
| 1 | 3968 | UK | English |
| 2 | 3968 | Spain | Spanish |
| 3 | 3968 | USA | English |
| 4 | 1234 | Greece | Greek |
| 5 | 1234 | Italy | Italian |
Я хочу выполнить один запрос, который выбирает только уникальный столбец "NUMBER" (будь то первая или последняя строка меня не беспокоит). Так это дало бы мне:
+--------+---------+-------------+-------------+
| ID | NUMBER | COUNTRY | LANG |
+--------+---------+-------------+-------------+
| 1 | 3968 | UK | English |
| 4 | 1234 | Greece | Greek |
Как это достижимо?
Ответы
Ответ 1
Поскольку вам все равно, я выбрал максимальный идентификатор для каждого номера.
select tbl.* from tbl
inner join (
select max(id) as maxID, number from tbl group by number) maxID
on maxID.maxID = tbl.id
Объяснение запроса
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
Ответ 2
Очень типичным подходом к этой проблеме является использование row_number()
:
select t.*
from (select t.*,
row_number() over (partition by number order by id) as seqnum
from t
) t
where seqnum = 1;
Это более обобщаемо, чем сравнение с минимальным id. Например, вы можете получить случайную строку, используя order by newid()
. Вы можете выбрать 2 строки, используя where seqnum <= 2
.
Ответ 3
Вы будете использовать следующий запрос:
SELECT * FROM [table] GROUP BY NUMBER;
Где [table]
- имя таблицы.
Это обеспечивает уникальный список для столбца NUMBER
, однако другие столбцы могут быть бессмысленными в зависимости от реализации поставщика; то есть они могут не совпадать с конкретными строками или строками.