如何使用GROUP BY使用SQL查询选择其他列

时间:2014-01-27 19:16:46

标签: sql sql-server tsql group-by

我有一个视图(这是几个表的联合),我需要过滤掉重复项。该表如下所示:

id    first    last    logo      email    entered
1     joe      smith   i.jpg     e@m.c    2014-01-27
2     jim      smith   b.jpg     e@j.c    2014-01-27
3     bob      smith   z.jpg     b@b.c    2014-01-27
9     joeseph  smith   q.gif     e@m.c    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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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日期。