具有最新记录的 Oracle 查询 GROUP BY [重复]

Posted

技术标签:

【中文标题】具有最新记录的 Oracle 查询 GROUP BY [重复]【英文标题】:Oracle query GROUP BY with latest record [duplicate] 【发布时间】:2021-07-20 03:09:43 【问题描述】:

我正在尝试获取在给定时间段内按客户名称分组的记录列表,但我获取的是每条记录而不是分组记录。

数据看起来像这样:

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; 

【问题讨论】:

【参考方案1】:

我会想到

时间戳降序排列行 在同一个客户名称中

(请参阅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 日,请更改分析函数的参数。如何?不知道,我没有看到任何明显的东西。

【讨论】:

请不要发布明显重复的问题的答案;请投票结束问题。 @Littlefoot 谢谢你的回答。事后看来,我应该在发帖前搜索 SOF 寻找类似的问题。我猜只是有点绝望。这个问题中发布的一些链接确实回答了我的问题。下次发帖前我会尽量检查。 不客气。请注意,不是我反对您发布的内容,而是另一个人的 - MT0。

以上是关于具有最新记录的 Oracle 查询 GROUP BY [重复]的主要内容,如果未能解决你的问题,请参考以下文章

group by查询每组时间最新的一条记录

SQL - 使用 GROUP BY 获取子查询子集中或连接中的最新记录

在Oracle中选择具有最近日期和时间的记录[重复]

oracle group by 查询 排序

优化 GROUP BY 查询以检索每个用户的最新行

输出具有最新记录且没有空值 Oracle 的单行