Условие совпадения группы DB2 Select, а затем выполните агрегацию listagg - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь получить группу данных с номером / c в списке и за последние n месяцев. Но когда я попробовал приведенный ниже запрос, он выдает мне ошибку!

пример данных:

date      refnumber seq_no txt   load_dt
20200310  016       01     emp1  20200309
20200310  016       01     emp1  20200305
20200310  016       02     row2  20200309
20200310  016       02     row2  20200305
20200310  016       03     row3  20200309
20200310  016       04     act   20200309
20200310  016       04     act   20200305
20200310  016       05     row4  20200309
20200310  016       05     row5  20200309
20200310  018       01     emp1  20200309
20200310  018       01     emp1  20200305
20200310  018       02     row2  20200309
20200310  018       02     row2  20200305
20200310  018       03     row3  20200309
20200310  018       04     row4  20200309
20200310  018       04     row4  20200305
20200310  018       05     row5  20200309
20200310  018       05     row5  20200305 

Мне нужно проверить, если text contains act и load_dt is max of available load dt, а затем получить всю группу с этими последовательностями и затем объединить все значения

пример вывода:

date     ref_number message_txt              load_dt
20200310 016        emp1|row2|row3|act|row5  20200309

запрос, который я пробовал до сих пор:

SELECT
DATE, REFNUMBER,
LISTAGG(CAST(TEXT AS VARCHAR(30000)), '|') WITHIN GROUP (ORDER BY CAST(SEQ_NO AS INT)) AS MESSAGE_TEXT FROM <table>
WHERE (DATE(date) BETWEEN (DATE('2020-03-10')-18 MONTHS)  AND (DATE('2020-03-10')-1))
GROUP BY DATE, NUMBER
HAVING COUNT(
CASE WHEN text IN (comma separated list of records)
THEN 1 END
) > 0
ORDER BY DATE(DATE)
  • Когда я пробовал меньшее количество месяцев, работает нормально, но не удаляет дубликаты

  • , когда я пытался, скажем, 18 месяцев, выдает ошибку ниже:

DB2 SQL Error: SQLCODE=-1585, SQLSTATE=54048, SQLERRMC=null, DRIVER=3.71.22

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Попробуйте как есть:

WITH TAB (date, refnumber, seq_no, text) AS
(
VALUES 
  ('20200310', '016', '01', 'emp1')
, ('20200310', '016', '01', 'emp1')
, ('20200310', '016', '02', 'row2')
, ('20200310', '016', '02', 'row2')
, ('20200310', '016', '03', 'row3')
, ('20200310', '016', '04', 'act ')
, ('20200310', '016', '04', 'act ')
, ('20200310', '016', '05', 'row4')
, ('20200310', '016', '05', 'row5')
, ('20200310', '018', '01', 'emp1')
, ('20200310', '018', '01', 'emp1')
, ('20200310', '018', '02', 'row2')
, ('20200310', '018', '02', 'row2')
, ('20200310', '018', '03', 'row3')
, ('20200310', '018', '04', 'row4')
, ('20200310', '018', '04', 'row4')
, ('20200310', '018', '05', 'row4')
, ('20200310', '018', '05', 'row5')
)

SELECT
  DATE, REFNUMBER
, LISTAGG(CAST(TEXT AS VARCHAR(3000)), '|') WITHIN GROUP (ORDER BY CAST(SEQ_NO AS INT)) AS MESSAGE_TEXT 
FROM
(
SELECT DISTINCT DATE(TO_DATE(DATE, 'YYYYMMDD')) AS DATE, REFNUMBER, SEQ_NO, TEXT
FROM TAB
--WHERE DATE(TO_DATE(date, 'YYYYMMDD')) BETWEEN DATE('2020-03-10') - 18 MONTHS AND DATE('2020-03-10') - 1
)
GROUP BY DATE, REFNUMBER
--HAVING COUNT(CASE WHEN text IN (comma separated list of records) THEN 1 END) > 0
ORDER BY DATE;

Результат:

|DATE      |REFNUMBER|MESSAGE_TEXT                                                                                        |
|----------|---------|----------------------------------------------------------------------------------------------------|
|2020-03-10|016      |emp1|row2|row3|act |row4|row5                                                                       |
|2020-03-10|018      |emp1|row2|row3|row4|row4|row5                                                                       |
1 голос
/ 19 марта 2020

Проверьте сообщение об ошибке

db2 ? SQL1585

SQL1585N  A temporary table could not be created because there is no
      available system temporary table space that has a compatible page
      size.

Это ясно указывает на проблему - обратитесь к администратору и попросите его добавить временное табличное пространство с соответствующим размером страницы.

Поддержка для отчетливый в листагг был добавлен в Db2 11.1 (для Unix Linux и Windows). Если вы используете другую версию или платформу для Db2, укажите ее.

...