【问题标题】:Using ISNULL function with LEAD function: having trouble将 ISNULL 函数与 LEAD 函数一起使用:遇到问题
【发布时间】:2019-04-29 08:44:50
【问题描述】:

我在组合 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

但不幸的是,这不起作用。非常感谢任何帮助。

【问题讨论】:

  • unfortunately this doesn't work. 它怎么不起作用?由于语法错误,您的查询不会执行?你没有得到你想要的结果?预期的结果是什么?
  • 为什么不直接使用default 参数? LEAD([t_stamp], 1, @ReportTimeEnd) OVER (ORDER BY [tbl_tg_machinestate_ndx])

标签: sql sql-server tsql window-functions


【解决方案1】:

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

如果您想区分最后一个值和空值,这种方法很有用。

【讨论】:

    【解决方案2】:

    试试这个:

      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
    

    我认为你这里有一个 sintax 错误:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多