寻求帮助修复一个小 sql 查询

Seeking help fixing a small sql query

我需要查询 return 过去 21 天的时间条目列表,按成员 ID 排序该列表,然后按开始时间排序,然后比较每一行的开始时间和结束时间上一行的时间,则显示开始时间大于上一行结束时间的行。

不幸的是,我对所有事情都不是很了解 sql 并且到目前为止我的查询 return 是一个错误,我不知道我需要什么 change/add/remove 来修复它。

这是我开始使用的视图的一个示例(想象一下还有几千行)。 starting view

当我运行下面的查询时,我得到了我想要的数据排列。

SELECT
t.time_recID AS id
,t.time_recID AS time_recid
,LOWER(t.Member_ID) AS member_id
,CAST(t.Time_Start_UTC AS DATETIME) AS evt_start
,CAST(t.Time_End_UTC AS DATETIME) AS evt_end
,LAG(t.Time_End_UTC,1,0) OVER (PARTITION BY t.Member_ID ORDER BY t.Time_Start_UTC) AS prev_evtend
FROM v_evt_time AS t
WHERE DATEADD (Day, -21, CURRENT_TIMESTAMP) <= t.Date_Start
ORDER BY member_id, evt_start
OFFSET 0 ROWS

query results getting close

但是当我在 WHERE 子句中添加一行来比较 evt_start 和 prev_evtend 列时……

WHERE DATEADD (Day, -21, CURRENT_TIMESTAMP) <= t.Date_Start
AND evt_start < prev_evtend

我收到一条错误消息,显示列名称无效 'evt_start'。列名称无效 'prev_evtstart'。

我需要做什么才能将查询修复为 return 我需要的结果? 非常感谢任何帮助,并提前致谢。

列名称 evt_startprev_evtend 在定义它们的 select 语句中不可用。

您可以使用如下通用 Table 表达式:

With entries as (
SELECT
t.time_recID AS id
,t.time_recID AS time_recid
,LOWER(t.Member_ID) AS member_id
,CAST(t.Time_Start_UTC AS DATETIME) AS evt_start
,CAST(t.Time_End_UTC AS DATETIME) AS evt_end
,LAG(t.Time_End_UTC,1,0) OVER (PARTITION BY t.Member_ID ORDER BY t.Time_Start_UTC) AS prev_evtend
FROM v_evt_time AS t
WHERE DATEADD (Day, -21, CURRENT_TIMESTAMP) <= t.Date_Start
ORDER BY member_id, evt_start
OFFSET 0 ROWS)
select * 
from entries
WHERE DATEADD (Day, -21, CURRENT_TIMESTAMP) <= t.Date_Start
AND evt_start < prev_evtend

这在功能上等同于原始查询之上的查询:

select *
from (
SELECT
t.time_recID AS id
,t.time_recID AS time_recid
,LOWER(t.Member_ID) AS member_id
,CAST(t.Time_Start_UTC AS DATETIME) AS evt_start
,CAST(t.Time_End_UTC AS DATETIME) AS evt_end
,LAG(t.Time_End_UTC,1,0) OVER (PARTITION BY t.Member_ID ORDER BY t.Time_Start_UTC) AS prev_evtend
FROM v_evt_time AS t
WHERE DATEADD (Day, -21, CURRENT_TIMESTAMP) <= t.Date_Start
ORDER BY member_id, evt_start
OFFSET 0 ROWS) sub
WHERE DATEADD (Day, -21, CURRENT_TIMESTAMP) <= t.Date_Start
AND evt_start < prev_evtend