通过约束获得两个组的行

时间:2016-06-01 01:38:05

标签: sql oracle

我有一张桌子

TIMESTAMP                 ID        Name
5/30/2016 11:45            1        Ben
5/30/2016 11:45            2        Ben
5/30/2016 23:15            2        Ben
5/30/2016 7:30             1        Peter
5/30/2016 6:05             1        Peter
5/30/2016 14:40            2        May
5/30/2016 1:05             1        May

现在,我需要为每个不同的名称获取MIN时间戳。 然后,如果有多个MIN条目,请选择具有MAX ID的条目。

所以结果应该是

TIMESTAMP                 ID        Name
5/30/2016 11:45            2        Ben
5/30/2016 6:05             1        Peter
5/30/2016 1:05             1        May

我尝试使用以下查询:

SELECT MIN(TIMESTAMP),来自TBLSAMPLE的名称,时间为4月到5月之间(' 5/30 / 2016',' MM / DD / YYYY')和到时(' 5/30 / 2016',' MM / DD / YYYY')+ 1 按名称分组

我可以得到最短的时间。但是一旦我添加了MAX(ID),结果就会返回一个与任何行都不匹配的条目。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用row_number()

执行此操作
select t.*
from (select t.*,
             row_number() over (partition by name order by timestamp asc, id desc) as seqnum
      from tblsample t
     ) t
where seqnum = 1;

您的问题未指明日期的条件。但是,如果要添加where子句,请将其添加到子查询中。