Использование функции ISNULL с функцией LEAD: возникли проблемы - PullRequest
0 голосов
/ 29 апреля 2019

У меня проблемы с объединением функций LEAD и ISNULL. Основной запрос выглядит так:

DECLARE @ReportTimeStart DATETIME = '2019-04-25 06:50'
DECLARE @ReportTimeEnd DATETIME = '2019-04-25 23:59';

SELECT
    [tbl_tg_machinestate_ndx],
    [Machine_State],
    [t_stamp],
    LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]) NextStateTime
FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
WHERE [t_stamp] BETWEEN @ReportTimeStart AND @ReportTimeEnd

Это дает мне длинный список, подобный этому:

tbl_tg_machinestate_ndx    Machine_State    t_stamp                    NextStateTime
5893                       130              2019-04-25 23:44:49.160    2019-04-25 23:46:34.670
5894                       170              2019-04-25 23:46:34.670    2019-04-25 23:50:01.370
5895                       100              2019-04-25 23:50:01.370    NULL

Я хочу использовать функцию ISNULL (), чтобы заменить это последнее значение NULL временем окончания моего отчета. Как это:

SELECT
    [tbl_tg_machinestate_ndx],
    [Machine_State],
    [t_stamp],
    ISNULL(
    (LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]) NextStateTime),
    @ReportTimeEnd)
  FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
  WHERE [t_stamp] BETWEEN @ReportTimeStart AND @ReportTimeEnd

Но, к сожалению, это не работает. Любая помощь высоко ценится.

Ответы [ 2 ]

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

LEAD функция принимает значение «по умолчанию», которое возвращается, когда оно пересекает конец окна.Используйте это так:

SELECT
    [tbl_tg_machinestate_ndx],
    [Machine_State],
    [t_stamp],
    LEAD([t_stamp], 1, @ReportTimeEnd) OVER (ORDER BY [tbl_tg_machinestate_ndx]) AS NextStateTime
    -- ----------------^
FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
WHERE [t_stamp] BETWEEN @ReportTimeStart AND @ReportTimeEnd

Этот подход полезен, если вы хотите различать последнее значение и нулевое значение.

0 голосов
/ 29 апреля 2019

Попробуйте это:

  SELECT
    [tbl_tg_machinestate_ndx],
    [Machine_State],
    [t_stamp],
    ISNULL(LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]),@ReportTimeEnd) NextStateTime
  FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
  WHERE [t_stamp] BETWEEN @ReportTimeStart AND @ReportTimeEnd

Я думаю, что у вас есть ошибка синтаксиса здесь:

ISNULL(
    (LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]) NextStateTime),
    @ReportTimeEnd)
...