Sql server 从所有列中获取最后一个非空值
有一种情况是,我试图从所有列中获取最后一个NOTNULL值。下面是一些数据,以供演示 测试数据Sql server 从所有列中获取最后一个非空值,sql-server,sql-server-2008,sql-server-2008-r2,Sql Server,Sql Server 2008,Sql Server 2008 R2,有一种情况是,我试图从所有列中获取最后一个NOTNULL值。下面是一些数据,以供演示 测试数据 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'), --&
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 ║
╚════╩══════╩══════╩══════╩═════════════════════════╝
结果集
╔════════════╦═══════╦═════════════════════════╗
║ 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 ║
╚════════════╩═══════╩═════════════════════════╝
它返回正确的结果。但我相信,通过更简单/高效的查询可以做到这一点。任何帮助或指针都很受欢迎我认为垂直行格式的your UNION选项更好,但如果您需要水平列格式的帮助或指针,则可以使用如下所示的自连接
SELECT top 1 t1.Col1, t2.Col2, t3.col3
FROM @t t1
inner join @t t2 on t2.col2 is not null
inner join @t t3 on t3.col3 is not null
where t1.col1 is not null
order by t1.dated desc
这是一个非常简单的操作,也是选择最新值的合适方法。
UNPIVOT
自动消除NULL
值:
;With Numbered as (
select *,ROW_NUMBER() OVER (PARTITION BY Col ORDER BY Dated desc) rn
from @t
unpivot (Value for Col in (Col1,Col2,Col3)) p
)
select * from Numbered where rn = 1
结果:
ID Dated Value Col rn
----------- ----------------------- ----------- -------- --------------------
1 2013-12-09 00:00:00.000 20 Col1 1
1 2013-12-10 00:00:00.000 100 Col2 1
1 2013-12-08 00:00:00.000 300 Col3 1
谢谢你的回复,比我的解决方案简单得多,更好得多,它提取了正确的数据,但正如你在我的结果集中看到的,我实际上是在旋转结果。如果您能更新答案,我将得到与所需输出完全相同的结果。您是明星达米恩您的查询是我刚才比较过的最便宜的三种解决方案,我的55%,Upendra的28%,您的17%。干杯,朋友:)
ID Dated Value Col rn
----------- ----------------------- ----------- -------- --------------------
1 2013-12-09 00:00:00.000 20 Col1 1
1 2013-12-10 00:00:00.000 100 Col2 1
1 2013-12-08 00:00:00.000 300 Col3 1