SQL查询组并获取最近的状态

SQL查询组并获取最近的状态,sql,oracle,group-by,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的最后状态:

我有一个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
我该怎么办


谢谢。

使用desc排序日期后的第一个值

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


我只想使用keep进行聚合:


最有效的方法是在单个聚合查询中完成这一切,不需要子查询和分析函数

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关键字用作列名。我将其更改为dt。

maxdt不会按照预期的输出处理空日期。我假设op的意思是,如果日期为空,那么它应该是最新的一行。@VamsiPrabhala-总的来说,您的观点是正确的。然而,我想知道为什么你认为op就是你所想的,或者为什么你相信你知道在这种情况下预期的输出是什么。问OP绝对值得。如果ID既有空日期又有非空日期,应该如何处理空日期?您是否需要考虑最近的NULL日期,或者如果有相同的ID的NULL和NULL NULL日期,那么忽略空日期吗?
select id,
       max(state) keep (dense_rank first order by date desc) as state,
       max(date) as date
from t
group by id;
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
;