sql - 将 ISNULL 函数与 LEAD 函数一起使用:遇到问题
问题描述
我在组合 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
但不幸的是,这不起作用。非常感谢任何帮助。
解决方案
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
如果您想区分最后一个值和空值,此方法很有用。
推荐阅读
- python - Binance websocket发送重复数据
- python-3.x - VS-Code Python 调试 - ConnectionRefusedError: [WinError 10061] 由于目标机器主动拒绝,无法建立连接
- angular - detectChanges 不更新异步管道
- android - RadioButton TextColor 出错了?如何改变它?
- hibernate - Hibernate 搜索聚合:countByDocumentType(带有 elaticsearch 后端)
- kotlin - kotlin:在类似应用程序的火种中添加cardstackview时片段中的错误
- excel - 搜索多个值,如果找到,检查偏移量是否包含值,如果偏移量单元格没有值则突出显示
- node.js - 无法使用 docker-compose 在本地运行 gatbsy 站点
- r - 基于tableby打印tex表
- robots.txt - 移动友好测试“页面无法访问”