【问题标题】:Oracle SQL query for Group By with Having clauseOracle SQL 查询 Group By withhaving 子句
【发布时间】:2018-12-10 14:21:40
【问题描述】:

我有下面的表 A:

HashKey     QueueStatus     CreationDateTime
1             IMM           21-NOV-18 01.56.28.977628000 AM
1             DEF           21-NOV-18 01.58.28.971628000 AM
1             SENT          21-NOV-18 01.59.28.977628000 AM
2             IMM           21-NOV-18 02.56.28.977628000 AM
2             MAN           21-NOV-18 02.57.28.977628000 AM
2             SENT          21-NOV-18 02.58.28.977628000 AM

我下面还有一张桌子B:

HashKey     ReleaseStatus  TrxNo  
1             SENT          XYZ
2             SENT          XYZ
3             null           XYZ

现在我需要一个查询,它为我提供 B 表中的所有列,其中 ReleaseStatus 为 SENT 以及表 A 中的先前队列状态(CreationDateTime 是决定因素)。

在这个例子中,我需要结果为 -

HashKey     ReleaseStatus  TrxNo   QueueStatus as PrevoiusQueueStatus
  1           SENT           XYZ       DEF
  2           SENT           XYZ       MAN

我已经尝试在表 A 上使用 & group by 查询,但无法通过 Have 子句获取前一个查询。

一些试验(select Hashkey,count(creationdatetime) from QueuedRecords group by Hashkey has creationdatetime

【问题讨论】:

  • 您在表 A 中的最终时间戳是否应该是 02:58,而不是 01:58?
  • 没错,Alex.edited

标签: sql database oracle oracle11g


【解决方案1】:

不用分组,可以使用lag()解析函数获取A表中每一行之前的状态:

select HashKey,
  QueueStatus,
  lag(QueueStatus) over (partition by HashKey order by CreationDateTime) as PreviousQueueStatus
from tablea

然后将其用作子查询(CTE 或内联视图)并将其加入表 B:

select b.HashKey, b.ReleaseStatus, b.TrxNo, a.PreviousQueueStatus
from tableb b
join (
  select HashKey,
    QueueStatus,
    lag(QueueStatus) over (partition by HashKey order by CreationDateTime) as PreviousQueueStatus
  from tablea
) a
on a.HashKey = b.HashKey
and a.QueueStatus = b.ReleaseStatus
where b.ReleaseStatus = 'SENT';

   HASHKEY RELE TRX PREV
---------- ---- --- ----
         1 SENT XYZ DEF 
         2 SENT XYZ MAN 

为了得到这个结果,我假设表 A 中最后 2/SENT 行中的时间应该是该 HashKey 的最后一次,例如02:58 而不是 01:58,因为这应该控制您看到的其他值。

db<>fiddle

【讨论】:

    【解决方案2】:
    WITH prev as 
    (SELECT HASHKEY, QUEUESTATUS, ROW_NUMBER() OVER (PARTITION BY HASHKEY ORDER BY CREATEDATETIME DESC) rn 
    FROM tA) 
    select tB.*, prev.QUEUESTATUS 
    FROM tB JOIN prev ON tB.HASHKEY = prev.HASHKEY
    where tB.RELEASESTATUS='SENT' and prev.rn = 2;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-22
      • 2023-04-04
      • 1970-01-01
      • 2016-02-20
      • 2014-12-17
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多