sql - 如何在 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?
解决方案
如果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
推荐阅读
- javascript - 如何添加前缀以响应本机文本输入?
- excel - 如何使用工作表中的过滤范围填充用户表单列表框
- sybase - 是否可以在sybase DB的单列中上传','分隔文件
- python - 如何在一个脚本中编写两个脚本计时器?
- vue.js - 如何在运行时在 vue.js 中读取服务器环境变量
- c# - C# StreamReader Readline 如何获取 \n 换行符
- jsf - 在 tabview 内的多个选项卡内的数据表内的 rowExpansion 仅引用最后一个选项卡中的行对象
- ruby-on-rails - FactoryBot 与 camcelCase ID 的关联
- javascript - 表单的 reset() 方法不会使用 value 属性重置输入
- php - 如何使用 PHP 发送 AMP 电子邮件?