Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DB2选择组匹配条件,然后执行agrgate listag_Db2_Oracle Sqldeveloper - Fatal编程技术网

DB2选择组匹配条件,然后执行agrgate listag

DB2选择组匹配条件,然后执行agrgate listag,db2,oracle-sqldeveloper,Db2,Oracle Sqldeveloper,我正在尝试获取列表中有a/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 r

我正在尝试获取列表中有a/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 
我需要检查文本是否包含act,load_dt是否为可用load dt的最大值,然后使用这些序列获取整个组,然后concat所有值

样本输出:

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个月时,它抛出了以下错误:

DB2SQL错误:SQLCODE=-1585,SQLSTATE=54048,SQLERRMC=null,DRIVER=3.71.22


提前谢谢

查看错误消息

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.
它清楚地指出了问题所在——联系管理员,让他添加一个具有适当页面大小的临时表空间

DB211.1 for Unix Linux和Windows中添加了对distinct in listagg的支持。
如果您为Db2使用另一个版本或平台,请指定它。

查看错误消息

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.
它清楚地指出了问题所在——联系管理员,让他添加一个具有适当页面大小的临时表空间

DB211.1 for Unix Linux和Windows中添加了对distinct in listagg的支持。 如果您为Db2使用另一个版本或平台,请指定它。

按原样尝试:

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                                                                       |
按原样试一试:

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                                                                       |

我刚刚知道还有另一个名为load_dt的字段,我需要检索最近加载的组,即->maxload_dt,它将删除重复项…仍在尝试此逻辑-未获得预期输出不确定您的环境,但尝试类似的操作,其中load_dt=从表中选择maxload_dt谢谢Michael,但是我必须获取每个日期的maxload_dt记录,现在我用连接条件解决了这个问题。它现在工作得很好!我唯一的问题是临时表错误…不知道如何联系管理员,是否还有其他解决方法…比如先过滤组,然后进行聚合?由于过滤后的记录数量将非常少,并且很容易进行concat…不要采取变通办法,这些将始终存在缺点。必须有一个选项,以找出管理员-你将需要他无论如何为其他情况以及。。。永远不要低估DBA能为你做的是的,明白了Michael,现在我正计划在hive中重写我的查询:我刚刚知道还有另一个名为load_dt的字段,我需要检索最近加载的组,即->maxload_dt,它将删除重复项…仍在尝试此逻辑-未获得预期输出不确定您的环境,但在哪里尝试类似的操作load_dt=从您的表中选择maxload_dt谢谢Michael,但是我必须获取每个日期的maxload_dt记录,现在我用连接条件解决了这个问题。它现在工作得很好!我唯一的问题是临时表错误…不知道如何联系管理员,是否还有其他解决方法…比如先过滤组,然后进行聚合?由于过滤后的记录数量将非常少,并且很容易进行concat…不要采取变通办法,这些将始终存在缺点。必须有一个选项,以找出管理员-你将需要他无论如何为其他情况以及。。。永远不要低估DBA能为您做些什么。是的,明白了Michael,现在我正计划在hive中重写我的查询: