Подтвердить что ты не робот

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       |

Как это достижимо?

4b9b3361

Ответ 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, однако другие столбцы могут быть бессмысленными в зависимости от реализации поставщика; то есть они могут не совпадать с конкретными строками или строками.