如何使用时间戳作为参考合并SQL Server 2014中同一表中的记录

问题描述 投票:0回答:2

目前我使用PIVOT()后的格式和数据值如下所示

NameID   DocumentName   Time  Value1  Value2  Value3  Value4  Value5
------   ------------   ----  ------  ------  ------  ------  ------
2221        Doc1        1053    23      24      25     NULL    NULL     
2221        Doc1        1153    31      32      NULL    28      30
2221        Doc2        1253    NULL    NULL    NULL    40      41  
2222        Doc3        1053    03      06      09      12      15

我需要将记录1,2,3与最新值合并为一行,格式就是这样。

NameID       Value1   Value2  Value3  Value4  Value5
------       ------   ------  ------  ------  ------
2221         31       32      25      40      41    
2222         03       06      09      12      15

它将使用时间戳作为参考来决定要更新的值以及将保留哪些值。任何帮助或开始将不胜感激我继续我的工作!

sql sql-server
2个回答
2
投票

这很棘手。

如果不了解pivot查询本身,也许最简单的方法是相关子查询或apply

select nameId,
       (select top (1) t2.documentname
        from t t2
        where t2.nameId = t.nameId and t2.documentname is not null
        order by t2.time desc
       ) as documentname,
       max(time) as time,
       (select top (1) t2.value1
        from t t2
        where t2.nameId = t.nameId and t2.value1 is not null
        order by t2.time desc
       ) as value1,
       (select top (1) t2.value2
        from t t2
        where t2.nameId = t.nameId and t2.value2 is not null
        order by t2.time desc
       ) as value2,
       . . .
from t;

0
投票

我在这里和你的问题看不出有任何区别......

How to transpose rows of data into a single row with different columns in SQL Server

我给你的答案是在进行数据转换之前已经取了最后的值,如果这是一个新的要求你可能只需要调整分区就可以了......

无论如何,如果这是不可能的并且假设您也在使用SQL Server 2014来满足此要求,那么您可以在当前方法上使用LAST_VALUE

WITH YourPivot AS (
    <Put your current pivot code here>
)
SELECT DISTINCT 
    NameID
    ,LAST_VALUE(Value1) OVER (PARTITION BY NameID ORDER BY CASE WHEN Value1 IS NOT NULL THEN 1 ELSE 0 END, [Time] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Value1
    ,LAST_VALUE(Value2) OVER (PARTITION BY NameID ORDER BY CASE WHEN Value2 IS NOT NULL THEN 1 ELSE 0 END, [Time]  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Value2
    ,LAST_VALUE(Value3) OVER (PARTITION BY NameID ORDER BY CASE WHEN Value3 IS NOT NULL THEN 1 ELSE 0 END, [Time]  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Value3
    ,LAST_VALUE(Value4) OVER (PARTITION BY NameID ORDER BY CASE WHEN Value4 IS NOT NULL THEN 1 ELSE 0 END, [Time]  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Value4
    ,LAST_VALUE(Value5) OVER (PARTITION BY NameID ORDER BY CASE WHEN Value5 IS NOT NULL THEN 1 ELSE 0 END, [Time]  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Value5
FROM YourPivot
© www.soinside.com 2019 - 2024. All rights reserved.