Как объединить записи в той же таблице в SQL Server 2014, используя отметку времени в качестве ссылки - PullRequest
0 голосов
/ 08 апреля 2019

В настоящее время у меня есть таблица после использования 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

Он будет использовать метку времени как ссылку, чтобы решить, какие значения обновить и какие значения будут сохранены.Буду признателен за любую помощь или старт для продолжения моей работы!

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Это сложно.

Без знания самого запроса 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 голосов
/ 08 апреля 2019

Я не вижу здесь никакой разницы между этим и вашим вопросом ...

Как преобразовать строки данных в одну строку с разными столбцами в SQL Server

Ответ, который я дал вам, уже принимает последние значения перед выполнением pivot, если это новое требование, вам, вероятно, просто нужно адаптировать разделы к нему ...

В любом случае, если это невозможно и предполагается, что вы используете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...