如何按列和最大日期分组时选择单行?

时间:2013-04-04 21:12:58

标签: sql oracle

我有以下数据我想过滤,所以我只根据第一列的分组得到一行并选择最大日期

co2包含唯一值

col1 | col2 | date

 1   |  123 | 2013
 1   |  124 | 2012
 1   |  125 | 2014
 2   |  213 | 2011
 2   |  214 | 2015
 2   |  215 | 2018

所以我想要的结果是:

 1   |  125 | 2014
 2   |  215 | 2018

我尝试过使用我在这里找到的一些例子(如下所示)以及/ distinct / max(日期)的其他组,但没有运气

select t.*
from (select t.*,
             row_number() over (partition by col1, col2 order by date desc) as seqnum
      from t
     ) t
where seqnum = 1

3 个答案:

答案 0 :(得分:3)

row_number()中的分区更改为仅按col1分区,但按date desc保持顺序:

select col1, col2, date
from 
(
  select col1, col2, date,
    row_number() over (partition by col1 
                       order by date desc) as rn
  from yourtable
) x
where rn = 1

请参阅SQL Fiddle with Demo

由于您要同时按col1col2进行分区,因此每行都会获得唯一值。因此它不会返回具有最大日期的行。

答案 1 :(得分:0)

我更喜欢bluefeet的方法,但这里使用的是MAX:

SELECT t.col1, t.col2, t.date
FROM yourtable t
    JOIN (
        SELECT col1, MAX(date) maxDate
        FROM yourtable
        GROUP BY col1
    ) t2 on t.col1 = t2.col1 AND t.date = t2.maxDate

SQL Fiddle Demo(借鉴其他帖子)

答案 2 :(得分:0)

    Select * from yourtable where date in 
(select max(date) from tab group by col1);