代码之家  ›  专栏  ›  技术社区  ›  NoBullMan

具有最新记录的Oracle查询分组依据

  •  0
  • NoBullMan  · 技术社区  · 5 年前

    我试图得到一个记录列表,在给定的时间段内按客户名称分组,但得到的是每一条记录,而不是分组的记录。

    数据如下所示:

    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; 
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Littlefoot    5 年前

    我会想到

    • 按时间戳按降序排序行
    • 在同一个客户端名称内

    (见 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日,请更改分析函数的参数。怎样不知道,我没看到什么明显的。