首页 > 解决方案 > 如何在 Oracle DB 中使用 max(Date) 和 Distinct。我想在一天内最后插入数据

问题描述

我正在寻找一种获取数据的方法。按最晚日期 在同一天按 UserId

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, value 我应该使用什么?

 max(Date) ? Distinct userId ?  Group  by userId?

标签: sqloracledatetimewhere-clausegreatest-n-per-group

解决方案


如果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

推荐阅读