我有一张数据如下的表:
Column1 | Column2 | Column3 | Value
SQ03 | D | 1000040 | 1000
SQ03 | | 1000040 | 1000
SQ03 | | 1000050 | 2000
SQ03 | | 1000060 | 3000
SQ03 | L | 1000060 | 3000
SQ03 | D | 1000060 | 3000
我需要做的是基于column3获取单个值。是column3中的值是唯一的,我需要获取该值。但是,如果Column3中有重复项,则需要获取Column2不为null的值。但是就像在上面的示例中一样,Column3的值中有Column2被多次标记的情况,在这种情况下,我只需要获取这些值之一,无论如何。
因此,我考虑使用以下解决方案标记我需要的那一行:
select *, CASE
WHEN "Column2" != ' '
THEN 'X'
WHEN "Column2" = ' ' AND row_number() over(PARTITION BY "Column3" ORDER BY "Column2" DESC, "Column3") = 1
THEN 'X'
ELSE 'O'
END AS "FLAG" from DUMMY
WHERE "Column1" = 'SQ03'
但是此解决方案的问题在于它正在汇总Column3中的值。像这样,它会将Column3中重复的值相加。
有人能帮助我解决我无法汇总值的问题吗?
编辑: 我的预期输出是这样:
Column1 | Column2 | Column3 | Value
SQ03 | D | 1000040 | 1000
SQ03 | | 1000050 | 2000
SQ03 | L | 1000060 | 3000
答案 0 :(得分:1)
您可以使用子查询为每个Column3
值生成行号(按Column2 DESC
排序以使NULL
值排在最后),然后选择具有{{1 }}:
row_number = 1
或者,您可以使用CTE:
SELECT Column1, Column2, Column3, Value
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Column3 ORDER BY Column2 DESC) AS rn
FROM DUMMY
WHERE Column1 = 'SQ03'
) D
WHERE rn = 1
两个查询的输出:
WITH CTE AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Column3 ORDER BY Column2 DESC) AS rn
FROM DUMMY
WHERE Column1 = 'SQ03'
)
SELECT Column1, Column2, Column3, Value
FROM CTE
WHERE rn = 1
答案 1 :(得分:0)
我认为聚合函数(作为窗口函数)可以满足您的需求:
select t.*,
max(column3) over (partition by column1)
from t;