在重写 SQL 查询时需要帮助
Need assistance in rewriting a SQL query
Select ID,LISTAGG(CATEGORY_CD, ',') WITHIN GROUP(ORDER BY CAST(P_NO as INT)) AS CATEGORY_CD
FROM table1
WHERE DATE = '2022-02-02'
AND CATEGORY_FLAG = '0'
AND CAT_SRC_CD NOT IN ('0','1','2','3')
group by ID
我需要重写上面的查询,使其按 P_NO 排序
我需要为 CATEGORY_CD 列显示不同的值。
我尝试了下面提到的逻辑,并在子查询中使用了 ORDER BY P_NO。不知道我写的逻辑对不对
SELECT ID,LISTAGG(distinct CATEGORY_CD, ',') WITHIN GROUP(ORDER BY CAST(CATEGORY_CD as INT)) AS CATEGORY_CD
FROM
(SELECT distinct ID,CREATE_DT,CATEGORY_CD,
TRY_CAST(P_NO as INTEGER) as P_NO
FROM table1
WHERE DATE = '2022-02-02'
AND CATEGORY_FLAG = '0'
AND CAT_SRC_CD NOT IN ('0','1','2','3')
ORDER BY P_NO
)
GROUP BY
ID;
我提到的原始查询给出了以下结果。我应该只显示 CATEGORY_CD 列的不同值,结果应该按 P_NO 列排序。
ID CATEGORY_CD
169174408 5,5,5,5
169174408 2,1,1
169174408 12,12,12,12,12,12
839946105 2,2,2,2,3,3,3,3,3,3,3,3
请指导我实现正确的逻辑。提前致谢:)
此外,如果我需要向我的原始查询添加另外几列,请指导我。我添加了原来的 SQL 查询,再次添加了另一列。
Select ID,LISTAGG(CATEGORY_CD, ',') WITHIN GROUP(ORDER BY CAST(P_NO as INT)) AS CATEGORY_CD,
LISTAGG(CATEGORY_DTL, ',') WITHIN GROUP(ORDER BY CAST(P_NO as INT)) AS CATEGORY_DTL
FROM table1
WHERE DATE = '2022-02-02'
AND CATEGORY_FLAG = '0'
AND CAT_SRC_CD NOT IN ('0','1','2','3')
group by ID
使用 QUALIFY
到 select 不同的 CATEGORY_CD
每个 ID
:
WITH cte AS (
SELECT *
FROM table1
WHERE DATE = '2022-02-02'
AND CATEGORY_FLAG = '0'
AND CAT_SRC_CD NOT IN ('0','1','2','3')
QUALIFY ROW_NUMBER() OVER(PARTITION BY ID,CATEGORY_CD ORDER BY P_NO::INT) = 1
)
SELECT ID,LISTAGG(CATEGORY_CD, ',') WITHIN GROUP(ORDER BY P_NO::int) AS CATEGORY_CD
FROM cte
GROUP BY ID;
Select ID,LISTAGG(CATEGORY_CD, ',') WITHIN GROUP(ORDER BY CAST(P_NO as INT)) AS CATEGORY_CD
FROM table1
WHERE DATE = '2022-02-02'
AND CATEGORY_FLAG = '0'
AND CAT_SRC_CD NOT IN ('0','1','2','3')
group by ID
我需要重写上面的查询,使其按 P_NO 排序 我需要为 CATEGORY_CD 列显示不同的值。
我尝试了下面提到的逻辑,并在子查询中使用了 ORDER BY P_NO。不知道我写的逻辑对不对
SELECT ID,LISTAGG(distinct CATEGORY_CD, ',') WITHIN GROUP(ORDER BY CAST(CATEGORY_CD as INT)) AS CATEGORY_CD
FROM
(SELECT distinct ID,CREATE_DT,CATEGORY_CD,
TRY_CAST(P_NO as INTEGER) as P_NO
FROM table1
WHERE DATE = '2022-02-02'
AND CATEGORY_FLAG = '0'
AND CAT_SRC_CD NOT IN ('0','1','2','3')
ORDER BY P_NO
)
GROUP BY
ID;
我提到的原始查询给出了以下结果。我应该只显示 CATEGORY_CD 列的不同值,结果应该按 P_NO 列排序。
ID CATEGORY_CD
169174408 5,5,5,5
169174408 2,1,1
169174408 12,12,12,12,12,12
839946105 2,2,2,2,3,3,3,3,3,3,3,3
请指导我实现正确的逻辑。提前致谢:)
此外,如果我需要向我的原始查询添加另外几列,请指导我。我添加了原来的 SQL 查询,再次添加了另一列。
Select ID,LISTAGG(CATEGORY_CD, ',') WITHIN GROUP(ORDER BY CAST(P_NO as INT)) AS CATEGORY_CD,
LISTAGG(CATEGORY_DTL, ',') WITHIN GROUP(ORDER BY CAST(P_NO as INT)) AS CATEGORY_DTL
FROM table1
WHERE DATE = '2022-02-02'
AND CATEGORY_FLAG = '0'
AND CAT_SRC_CD NOT IN ('0','1','2','3')
group by ID
使用 QUALIFY
到 select 不同的 CATEGORY_CD
每个 ID
:
WITH cte AS (
SELECT *
FROM table1
WHERE DATE = '2022-02-02'
AND CATEGORY_FLAG = '0'
AND CAT_SRC_CD NOT IN ('0','1','2','3')
QUALIFY ROW_NUMBER() OVER(PARTITION BY ID,CATEGORY_CD ORDER BY P_NO::INT) = 1
)
SELECT ID,LISTAGG(CATEGORY_CD, ',') WITHIN GROUP(ORDER BY P_NO::int) AS CATEGORY_CD
FROM cte
GROUP BY ID;