簡體   English   中英

如何使用時間戳作為參考合並SQL Server 2014中同一表中的記錄

[英]How do I merge records in the same table in SQL Server 2014 using timestamp as reference

目前,在將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

它將使用時間戳作為參考來決定更新哪些值以及將保留哪些值。 任何幫助或開始對我來說都是不勝感激的,繼續我的工作!

這很棘手。

在不了解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;

我在這里看不到這個問題和您的問題有什么區別...

如何在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM