我有一个视图(这是几个表的联合),我需要过滤掉重复项。该表如下所示:
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
答案 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
日期。