从分组集中选择特定未分组的列

时间:2014-05-21 15:56:28

标签: sql oracle plsql group-by

这个话题可能有点不清楚,但我无法用一句话描述我想要实现的目标。

假设我有一个表(列)

id      INT     PK
name    VARCHAR
date    DATE

我有分组选择

select
    name,
    max(date)
from table
group by name

给我一​​个名字和最新日期。

将id列连接到当前聚合结果集的最简单方法是使用id值,其中日期是最大值?

让我用一个例子解释我的目标:

该表填充了以下数据

id      name        date
1       david       2012-12-12
2       david       2013-12-02
3       patrick     2014-01-02
4       patrick     2012-11-11

根据我的疑问,我希望得到以下结果

id      name        date
2       david       2013-12-02
3       patrick     2014-01-02

请注意,name = 'david'的所有记录都已汇总,并且选择了最大日期。如何获取此最大日期的行ID?

1 个答案:

答案 0 :(得分:1)

一种选择是使用ROW_NUMBER()

SELECT id, name, date
FROM (
    SELECT id, name, date, 
        row_number() over (partition by name order by date desc) rn
    FROM yourtable
) t
WHERE rn = 1

另一种选择是使用MAX()聚合将表连接回自身。如果多个ID /名称组合共享相同的最大日期,则此选项可能会导致联系:

SELECT t.id, t.name, t.date
FROM yourtable t
    JOIN (SELECT name, max(date) maxdate
          FROM yourtable
          GROUP BY name) t2 on t.name = t2.name AND t.date = t2.maxdate