2014-01-27 1 views
0

У меня есть представление (это объединение нескольких таблиц), и мне нужно отфильтровать дубликаты. Таблица выглядит следующим образом:Как я могу выбрать дополнительные столбцы с помощью запроса TSQL, используя GROUP BY

id first last logo  email entered 
1  joe  smith i.jpg  [email protected] 2014-01-27 
2  jim  smith b.jpg  [email protected] 2014-01-27 
3  bob  smith z.jpg  [email protected] 2014-01-27 
9  joeseph smith q.gif  [email protected] 2014-01-20 

Я хочу сделать что-то вроде этого, но я не могу показаться, чтобы получить правильный синтаксис для этого:

SELECT 
    email, MAX(entered), first, last -- such that first and last come from the same row as the MAX(entered) 
FROM 
    my_view 
GROUP BY 
    email 

ответ

3

Вы хотите использовать row_number():

SELECT email, entered, first, last 
FROM (select v.*, row_number() over (partition by email order by entered desc) as seqnum 
     from my_view v 
    ) v 
WHERE seqnum = 1; 

row_number() является функцией окна, которое присваивает порядковые номера для групп строк. Группы определяются положением partition by. В этом случае все с одним и тем же email находится в одной группе. Первая строка имеет значение 1; порядок основан на предложении order by.

Внешний запрос выбирает первый, который имеет самую большую дату entered.

+0

Спасибо. Я принял ваш ответ, поскольку он объясняет причину и причину более подробно. – Nate

4

Поскольку ваши имена не совпадают на дублирующие строки электронной почты, вы должны использовать функцию row_number() вместо:

select email, entered, first, last 
from (
select *, row_number() over (partition by email order by entered desc) rn 
from my_view 
) x 
where rn = 1 

Вам нужно подзапрос, потому что row_number() не допускается в пункте where.

+0

Проблема заключается в том, что не удаляются дубликаты писем из набора результатов. Это дает мне те же результаты, что и без GROUP BY. – Nate

+0

Ваши образцы данных имеют одинаковое имя против дубликатов электронных писем - разве это не так в ваших реальных данных? \ – Blorgbeard

+0

хорошая точка. В моем примере здесь имена одинаковы, в моих реальных данных некоторые столбцы будут одинаковыми, но некоторые не будут. Я обновлю свой образец. – Nate

Смежные вопросы