不带聚合的按函数划分的SQL
我有一个包含如下数据的表:不带聚合的按函数划分的SQL,sql,Sql,我有一个包含如下数据的表: Column1 | Column2 | Column3 | Value SQ03 | D | 1000040 | 1000 SQ03 | | 1000040 | 1000 SQ03 | | 1000050 | 2000 SQ03 | | 1000060 | 3000 SQ03 | L | 1000060 | 3000 SQ03 | D | 10000
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
我需要做的是根据第3列得到一个值。如果第3列中的值是唯一的,我需要得到该值。但如果Column3中存在重复项,则需要获取Column2不为null的值。但就像我在上面展示的例子一样,第3列中有一些值,其中第2列被标记了不止一次,在这些情况下,我只需要得到其中一个值,不管是什么
因此,我考虑用以下解决方案标记我需要的行:
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'
但这个解决方案的问题是它将第3列的值聚合起来。与之类似,它对第3列有重复项的值求和
有谁能帮我找到一个解决方案,在那里我没有得到聚合的值
编辑:
我的预期输出如下:
Column1 | Column2 | Column3 | Value
SQ03 | D | 1000040 | 1000
SQ03 | | 1000050 | 2000
SQ03 | L | 1000060 | 3000
我认为聚合函数(作为窗口函数)可以满足您的需要:
select t.*,
max(column3) over (partition by column1)
from t;
您可以使用子查询为每个
Column3
值生成行号(按Column2 DESC
排序,使NULL
值排在最后),然后选择具有行号=1
的行:
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
或者,您可以使用CTE:
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
两个查询的输出:
Column1 Column2 Column3 Value
SQ03 D 1000040 1000
SQ03 (null) 1000050 2000
SQ03 L 1000060 3000
您可以使用以下选项进行测试:选择Top 1*其中“Column1”=“SQ03”按列2排序您所显示的示例数据的预期输出是什么?我对您的代码与您的问题之间的关系感到困惑。一个是关于获得价值。另一个设置了一个标志。@Nick我已经用我的预期输出更新了线程,结果成功了@Nick!今天我学到了一些新东西!非常感谢你的帮助@雷纳托:不用担心,我很高兴能帮上忙。