SQL查询组并获取最新状态

时间:2018-12-06 15:49:57

标签: sql oracle group-by

我有这个oracle sql表:

ID | State | Date
x  |  A    | 18-01-01
x  |  B    | 18-01-02
x  |  C    | 18-01-03
y  |  D    | 18-01-04
y  |  E    | 18-01-05
y  |  F    | 18-01-06
z  |  G    | 18-01-07
z  |  H    | 18-01-08
z  |  I    | NULL

我必须编写一个查询,以向我返回ID的最后状态:

ID | State | Date
X  |  C    | 18-01-03
Y  |  F    | 18-01-06
Z  |  I    | NULL

我该怎么办?

谢谢。

4 个答案:

答案 0 :(得分:1)

使用ROW_NUMBER()

Select id,state,date
FROM
(
select id,
       ROW_NUMBER() OVER(partition by id order by date desc) as state,
       date 
from mytable
)a
WHERE state=1;

答案 1 :(得分:0)

按desc排序日期后使用first_value

  select distinct id, first_value(state)    over(partition by state order by date desc)  as 
  state,date from tbl

答案 2 :(得分:0)

我只会使用keep使用聚合:

select id,
       max(state) keep (dense_rank first order by date desc) as state,
       max(date) as date
from t
group by id;

答案 3 :(得分:0)

最有效的方法是在单个聚合查询中完成所有操作(不需要子查询和分析功能)。

select   id
     ,   min(state) keep (dense_rank last order by dt) as state
     ,   max(dt) as dt
from     <your_table>
group by id
order by id  --  if needed
;

Oracle关键字,例如date不应用作列名。我将其更改为dt