sql - 具有最新记录的 Oracle 查询 GROUP BY
问题描述
我正在尝试获取在给定时间段内按客户名称分组的记录列表,但我正在获取每条记录而不是分组记录。
数据看起来像这样:
ReqTS ClientName ItemID Outcome
2021-04-25 13:19:20:928 10.20.30.40 ABCD1 X0
2021-04-24 13:20:22:345 10.20.30.40 ABCD2 Y0
2021-04-26 13:21:35:456 10.20.30.40 ABCD3 X2
2021-04-25 13:18:45:589 10.20.40.50 ABCD4 Y1
2021-04-24 13:22:34:832 10.20.40.50 ABCD5 X0
我需要得到:
2021-04-26 13:21:35:456 10.20.30.40 ABCD3 X2
2021-04-24 13:22:34:832 10.20.40.50 ABCD5 X0
我试过这个,但它返回所有记录:
select reqts, clientname,itemid, outcome
from reqresplog
where logdate <= to_timestamp('04/26/2021', 'mm/dd/yyyy') and logdate >= to_timestamp('04/24/2021', 'mm/dd/yyyy')
group by clientname,reqts,itemid, outcome
order by reqts desc;
解决方案
我会想到
- 按时间戳降序排列行
- 在同一个客户名下
(请参阅ROW_NUMBER
分析函数),然后获取在该组中排序为第一行的行。
第二组的结果看起来不对;4 月 25 日比 24 日“晚”。
采样数据直到第 8 行;实际查询从第 10 行开始。
SQL> with reqresplog (reqts, clientname, itemid, outcome) as
2 (select
3 to_timestamp('2021-04-25 13:19:20:928', 'yyyy-mm-dd hh24:mi:ss:ff3'), '10.20.30.40', 'ABCD1', 'X0' from dual union all select
4 to_timestamp('2021-04-24 13:20:22:345', 'yyyy-mm-dd hh24:mi:ss:ff3'), '10.20.30.40', 'ABCD2', 'Y0' from dual union all select
5 to_timestamp('2021-04-26 13:21:35:456', 'yyyy-mm-dd hh24:mi:ss:ff3'), '10.20.30.40', 'ABCD3', 'X2' from dual union all select
6 to_timestamp('2021-04-25 13:18:45:589', 'yyyy-mm-dd hh24:mi:ss:ff3'), '10.20.40.50', 'ABCD4', 'Y1' from dual union all select
7 to_timestamp('2021-04-24 13:22:34:832', 'yyyy-mm-dd hh24:mi:ss:ff3'), '10.20.40.50', 'ABCD5', 'X0' from dual
8 )
9 select reqts, clientname, itemid, outcome
10 from (select r.*,
11 row_number() over (partition by r.clientname order by r.reqts desc) rn
12 from reqresplog r
13 )
14 where rn = 1;
REQTS CLIENTNAME ITEMID OUTCOME
------------------------------ ----------- ------ ----------
26.04.21 13:21:35,456000000 10.20.30.40 ABCD3 X2
25.04.21 13:18:45,589000000 10.20.40.50 ABCD4 Y1
SQL>
如果由于某种原因,您仍然想要 4 月 24 日,请更改分析函数的参数。如何?不知道,我没有看到任何明显的东西。
推荐阅读
- encryption - 键入客户端加密云存储的用例
- matlab - 为什么在 MATLAB 中使用 pcregrigid 方法时没有完整的 RootMeanSquareError 输出?
- php - 使用 PHP 将 mySQL 数据库中的数据显示到 vue.js 前端
- c# - 有没有办法在页面加载时单独加载网格视图?
- python - 如何训练模型将输入分类到一个或多个类
- android - Modelview 和 viewpager2:当页面不可见时,如何停止观察 liveData?
- timestamp - 如何使用 Talend 将毫秒转换为时间戳
- swiftui - SwiftUI 不能直接调用修饰符 自定义图像修饰符时?
- apache-camel - 我们可以在 quarkus+Camel 应用程序中使用 XML DSL
- swift - 在 SwiftUI 2.0 中隐藏状态栏