不带聚合的按函数划分的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!今天我学到了一些新东西!非常感谢你的帮助@雷纳托:不用担心,我很高兴能帮上忙。