SQL按功能分区而不进行聚合

时间:2020-01-20 00:07:51

标签: sql

我有一张数据如下的表:

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

2 个答案:

答案 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

Demo on SQLFiddle

答案 1 :(得分:0)

我认为聚合函数(作为窗口函数)可以满足您的需求:

select t.*,
       max(column3) over (partition by column1)
from t;