Oracle SQL-запрос для Group By с предложением Have - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть таблица 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 и предыдущий статус очереди (CreationDateTime является фактором, который должен принять решение) из таблицы A.

В этом примере мне нужен результат как -

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

Я пробовал с наличием &группировать по запросам в таблице A, но не может получить предыдущий по предложению Have.

Некоторые из пробных версий (выберите Hashkey, считать (creationdatetime) из группы QueuedRecords по Hashkey, имеющему creationdatetime

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018
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;
0 голосов
/ 10 декабря 2018

Вместо группировки вы можете использовать аналитическую функцию 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 

Чтобы получить такой результат, я предположил, что время в вашей последней строке 2 / SENT в таблице A должно быть последним для этого HashKey, например, 02: 58, а не 01:58, поскольку это должно контролировать, какое другое значение вы видите.

db <> fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...