如何从 SQL 或 Azure Synapse 中的多个列中获取最新的非空值
How to get the latest not null value from multiple columns in SQL or Azure Synapse
我有如下格式的数据
我想要以下格式的输出
请帮助我 SQL 代码。谢谢!
就像我在评论中提到的那样,您需要 修复插入数据的任何内容,而不是丢失值,以便它们在“较新的”中成为 NULL
" 行。
为了得到你想要的结果,你将不得不使用行编号和条件聚合,你拥有的列越多,这就会变得越乱;以及为什么你需要来解决真正的问题。这看起来像这样:
WITH CTE AS(
SELECT GroupingColumn,
NullableCol1,
NullableCol2,
DateColumn,
CASE WHEN NullableCol1 IS NOT NULL THEN ROW_NUMBER() OVER (PARTITION BY GroupingColumn, CASE WHEN NullableCol1 IS NULL THEN 1 ELSE 0 END ORDER BY DateColumn DESC) AS NullableCol1RN,
CASE WHEN NullableCol2 IS NOT NULL THEN ROW_NUMBER() OVER (PARTITION BY GroupingColumn, CASE WHEN NullableCol2 IS NULL THEN 1 ELSE 0 END ORDER BY DateColumn DESC) AS NullableCol2RN
FROM dbo.YourTable)
SELECT GroupingColumn,
MAX(CASE NullableCol1RN WHEN 1 THEN NullableCol1 END) AS NullableCol1,
MAX(CASE NullableCol2RN WHEN 1 THEN NullableCol2 END) AS NullableCol2,
MAX(DateColumn) AS DateColumn
FROM CTE;
我有如下格式的数据
我想要以下格式的输出
请帮助我 SQL 代码。谢谢!
就像我在评论中提到的那样,您需要 修复插入数据的任何内容,而不是丢失值,以便它们在“较新的”中成为 NULL
" 行。
为了得到你想要的结果,你将不得不使用行编号和条件聚合,你拥有的列越多,这就会变得越乱;以及为什么你需要来解决真正的问题。这看起来像这样:
WITH CTE AS(
SELECT GroupingColumn,
NullableCol1,
NullableCol2,
DateColumn,
CASE WHEN NullableCol1 IS NOT NULL THEN ROW_NUMBER() OVER (PARTITION BY GroupingColumn, CASE WHEN NullableCol1 IS NULL THEN 1 ELSE 0 END ORDER BY DateColumn DESC) AS NullableCol1RN,
CASE WHEN NullableCol2 IS NOT NULL THEN ROW_NUMBER() OVER (PARTITION BY GroupingColumn, CASE WHEN NullableCol2 IS NULL THEN 1 ELSE 0 END ORDER BY DateColumn DESC) AS NullableCol2RN
FROM dbo.YourTable)
SELECT GroupingColumn,
MAX(CASE NullableCol1RN WHEN 1 THEN NullableCol1 END) AS NullableCol1,
MAX(CASE NullableCol2RN WHEN 1 THEN NullableCol2 END) AS NullableCol2,
MAX(DateColumn) AS DateColumn
FROM CTE;