Получение последних результатов из множества, сгруппированных только по пользователю в DB2 / 400 - PullRequest
0 голосов
/ 07 октября 2019

Я публикую свой запрос и результаты, но я пытаюсь ограничить его только последним статусом и отметкой времени создателем.

    select t2.creator, t1.event_id, t2.status, max(t2.createdTS)
    from schema.event T1
    inner join schema.event_to_event_statust T2
    on t1.event_id = t2.event_id
    group by t2.creator, t1.event_id, t2.status;



    creator     |   event_id    |   status  | createdTS
    -----------------------------------------------------
    123                 1           New         2019-01-29 17:27:50.899408
    123                 1           Live        2019-01-29 17:29:50.899408
    123                 1           Closed      2019-01-29 17:45:50.899408
    456                 5           New         2019-01-29 17:32:50.899408
    456                 5           Live        2019-01-29 17:48:50.899408

Мои желаемые результаты для этого набора на самом деле будут

    creator     |   event_id    |   status  | createdTS
    -----------------------------------------------------
    123                 1           Closed      2019-01-29 17:45:50.899408
    456                 5           Live        2019-01-29 17:48:50.899408

Таким образом, у меня должен быть только один ряд на создателя, и это должна быть самая последняя запись. Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Работает ли на вашем IBM i следующее "как есть"?

WITH RES (creator, event_id, status, createdTS) AS 
(
VALUES
  (123, 1, 'New',    TIMESTAMP('2019-01-29 17:27:50.899408'))
, (123, 1, 'Live',   TIMESTAMP('2019-01-29 17:29:50.899408'))
, (123, 1, 'Closed', TIMESTAMP('2019-01-29 17:45:50.899408'))
, (456, 5, 'New',    TIMESTAMP('2019-01-29 17:32:50.899408'))
, (456, 5, 'Live',   TIMESTAMP('2019-01-29 17:48:50.899408'))
)
SELECT creator, event_id, status, createdTS
FROM 
(
SELECT creator, event_id, status, createdTS
, ROWNUMBER() OVER (PARTITION BY creator ORDER BY createdTS desc) AS rn
FROM RES
) T
WHERE RN=1;

Если нет, то какая у вас версия и модификация IBM i?

0 голосов
/ 07 октября 2019

Попробуйте

with temp as (
 select t2.creator, t1.event_id, t2.status, t2.createdTS
        row_number() over (partition by t2.creator order by t2.createdTS desc) as rownum
    from schema.event T1
    inner join schema.event_to_event_statust T2
    on t1.event_id = t2.event_id
    group by t2.creator, t1.event_id, t2.status
)
select creator, event_id, status, createdTS
  from temp
 where rownum = 1

@ MarkBarinstein: Спасибо, SQL исправлен

альтернатива может быть

select t2.creator, t1.event_id, t2.status, t2.createdTS
    from event T1
    inner join event_to_event_status T2
    on t1.event_id = t2.event_id
 INNER JOIN (select event_id, creator, max(createdts) AS createdts
              FROM  event_to_event_status
              GROUP BY event_id, creator) AS x
              ON t2.event_id = x.event_id AND t2.creator = x.creator AND t2.createdts = x.createdts

У меня нет iSeries, чтобы попробовать его извините

...