我正在寻找一种获取数据的方法。通过最近日期在同一天按用户ID
UserId,Value1,Date
1, 2030,2020–09-07 10:58:58
1, 2020,2020–09-07 05:58:28
1, 2050,2020–09-08 19:58:28
2, 3000,2020–09-07 10:58:18
2, 2001,2020–09-06 10:58:55
3, 2400,2020–09-08 10:28:53
4, 2400,2020–09-07 13:28:53
例如
where Date >= trunc(TO_DATE(’20200907’,’YYYYMMDD’)) and Date < trunc(TO_DATE(’20200908’,’YYYYMMDD’))
理想结果
UserId,Value
1,2050
2,3000
4,2400
选择UserId,值我应该用什么?
max(Date) ? Distinct userId ? Group by userId?
如果value
是您想要的唯一列,那么您可以使用keep
:
select userid, max(value1) keep(dense_rank last order by dt) value1
from mytable
where dt >= date '2020-09-07' and dt < date '2020-09-08'
group by userid
order by userid
注:
这使用标准的
date
语法而不是to_date()
来构建文字日期date
是Oracle中的保留字,因此不是列名的好选择;我在查询中将其重命名为dt
。
如果你想在结果集中有更多的列,那么用窗口函数过滤更合适:
select t.*
from (
select t.*, row_number() over(partition by userid order by dt desc) rn
from mytable t
where dt >= date '2020-09-07' and dt < date '2020-09-08'
) t
where rn = 1