Как PIVOT следующий ROW_NUMBER () - PullRequest
2 голосов
/ 09 марта 2019

У меня есть временная таблица, которая заполняется этим запросом:

SELECT  att.property, att.stayDate, att.addedTimeStamp, att.rowNumber
    FROM
    (
    SELECT  RIGHT('000' + CAST(att.property AS VARCHAR(4)),4) AS property,
            CAST(att.stay_date AS DATE) AS stayDate,
            CAST(added_timestamp AS DATETIME) AS addedTimeStamp,
            ROW_NUMBER() OVER(PARTITION BY property, stay_date ORDER BY added_timestamp) AS rowNumber
        FROM dbo.tb_rm_portal_attention_days att
            WHERE att.revenue_initiative = 'Test'
    ) att

Что затем приводит меня к следующей таблице временных параметров:

property   stayDate     addedTimeStamp             rowNumber
0053       2020-03-20   2019-03-04 17:10:32.837    1
0053       2020-03-20   2019-03-05 17:10:29.480    2
0053       2020-03-20   2019-03-06 17:10:25.940    3
0053       2020-03-20   2019-03-07 17:10:21.930    4
0100       2020-03-25   2019-03-04 17:10:32.837    1
0100       2020-03-25   2019-03-05 17:10:29.480    2
0100       2020-03-25   2019-03-06 17:10:25.940    3
0100       2020-03-25   2019-03-07 17:10:21.930    4

Отсюда я хотел бы иметь property, stayDate, addedTimeStamp, а затем следующий addedTimeStamp в группе, и если это максимум, просто вернуть NULL или что-то еще ... не конечно, если это имеет смысл ...

Какова моя конечная цель, по сути, получить из этой временной таблицы следующее:

property   stayDate      firstTimeStamp            secondTimeStamp
0053       2020-03-20    2019-03-04 17:10:32.837   2019-03-05 17:10:29.480
0053       2020-03-20    2019-03-05 17:10:29.480   2019-03-06 17:10:25.940
0053       2020-03-20    2019-03-06 17:10:25.940   2019-03-07 17:10:21.930
0053       2020-03-20    2019-03-06 17:10:25.940   NULL
0100       2020-03-25    2019-03-04 17:10:32.837   2019-03-05 17:10:29.480
0100       2020-03-25    2019-03-05 17:10:29.480   2019-03-06 17:10:25.940
0100       2020-03-25    2019-03-06 17:10:25.940   2019-03-07 17:10:21.930
0100       2020-03-25    2019-03-06 17:10:25.940   NULL

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Вы хотите lead(), но вам не нужен подзапрос:

SELECT RIGHT('000' + CAST(att.property AS VARCHAR(4)), 4) AS property,
       CAST(att.stay_date AS DATE) AS stayDate,
       CAST(added_timestamp AS DATETIME) AS firstTimeStamp,
       LEAD(added_timestamp) OVER (PARTITION BY property, stay_date ORDER BY added_timestamp) AS secondTimeStamp
FROM dbo.tb_rm_portal_attention_days att
WHERE att.revenue_initiative = 'Test'
1 голос
/ 09 марта 2019

Это прекрасный пример использования оконной функции LEAD

LEAD(firstTimeStamp) OVER 
    (PARTITION BY property, stay_date ORDER BY added_timestamp) AS secondTimeStamp

Вы можете указать LEAD в своем основном запросе и удалить ROW_NUMBER, если он вам не нужен в других местах.

SELECT  att.property, att.stayDate, att.addedTimeStamp, att.rowNumber, att.secondTimeStamp
    FROM
    (
    SELECT  RIGHT('000' + CAST(att.property AS VARCHAR(4)),4) AS property,
            CAST(att.stay_date AS DATE) AS stayDate,
            CAST(added_timestamp AS DATETIME) AS addedTimeStamp,
            ROW_NUMBER() OVER
                (PARTITION BY property, stay_date ORDER BY added_timestamp) AS rowNumber,

            LEAD(added_timestamp) OVER 
                (PARTITION BY property, stay_date ORDER BY added_timestamp) AS secondTimeStamp

        FROM dbo.tb_rm_portal_attention_days att
            WHERE att.revenue_initiative = 'Test'
    ) att
...