我有一种情况,我试图从所有列中获取最后一个非空值。这里是一些数据来演示puposes。从所有列中获取最后一个NOT NULL值
测试数据
DECLARE @t TABLE (ID INT, Col1 INT, Col2 INT, Col3 INT, Dated DATETIME)
INSERT INTO @t VALUES
(1, NULL, 100 , NULL, '20131210'), --<-- Column2 from this row
(1, 20 , 200 , NULL, '20131209'), --<-- Column1 from this row
(1, 30 , NULL , 300 , '20131208'), --<-- Column3 from this row
(1, 40 , 400 , NULL, '20131207')
╔════╦══════╦══════╦══════╦═════════════════════════╗
║ ID ║ Col1 ║ Col2 ║ Col3 ║ Dated ║
╠════╬══════╬══════╬══════╬═════════════════════════╣
║ 1 ║ NULL ║ 100 ║ NULL ║ 2013-12-10 00:00:00.000 ║
║ 1 ║ 20 ║ 200 ║ NULL ║ 2013-12-09 00:00:00.000 ║
║ 1 ║ 30 ║ NULL ║ 300 ║ 2013-12-08 00:00:00.000 ║
║ 1 ║ 40 ║ 400 ║ NULL ║ 2013-12-07 00:00:00.000 ║
╚════╩══════╩══════╩══════╩═════════════════════════╝
我建立了一个查询返回所需的结果。但是想知道是否有更高性能的这种做法。由于这种方式,我每次希望找到获得这些结果的更有效方法时,都在嘲笑整个表格。
我的查询
SELECT ColumnName, Col1 AS Value, Dated
FROM
(
SELECT TOP 1 'Column1' AS ColumnName
, Col1
, Dated
FROM @t
WHERE Col1 IS NOT NULL
ORDER BY Dated DESC
)Q1
UNION ALL
SELECT * FROM
(
SELECT TOP 1 'Column2' AS ColumnName
, Col2
, Dated
FROM @t
WHERE Col2 IS NOT NULL
ORDER BY Dated DESC
)Q2
UNION ALL
SELECT * FROM
(
SELECT TOP 1 'Column3' AS ColumnName
, Col3
, Dated
FROM @t
WHERE Col3 IS NOT NULL
ORDER BY Dated DESC
)Q3
结果集
╔════════════╦═══════╦═════════════════════════╗
║ ColumnName ║ Value ║ Dated ║
╠════════════╬═══════╬═════════════════════════╣
║ Column1 ║ 20 ║ 2013-12-09 00:00:00.000 ║
║ Column2 ║ 100 ║ 2013-12-10 00:00:00.000 ║
║ Column3 ║ 300 ║ 2013-12-08 00:00:00.000 ║
╚════════════╩═══════╩═════════════════════════╝
它返回正确的结果。但我确信它可以通过更简单/高效的查询完成。任何帮助或指针是多少appericiated
你是一个明星达米安你的查询是最便宜的我刚刚比较了所有三种解决方案,矿山55%,Upendra的28%和你的17%的批次。干杯朋友:) –