Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从所有列中获取最后一个非空值_Sql Server_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

Sql server 从所有列中获取最后一个非空值

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'), --&

有一种情况是,我试图从所有列中获取最后一个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'),  --<-- 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