我需要帮助将我的 Python 代码转换为 SQL:
req_id_mem = ""
req_workflow_mem = ""
collect_state_main = []
collect_state_temp = []
for req_id, req_datetime, req_workflow in zip(df["TICKET_ID"], df["DATETIMESTANDARD"], df["STATUS"]):
if req_id_mem == "" or req_id_mem != req_id:
req_id_mem = req_id
req_workflow_mem = ""
collect_state_temp = []
if req_workflow_mem == "" and req_workflow == "Open" and req_id_mem == req_id:
req_workflow_mem = req_workflow
collect_state_temp.append(req_id)
collect_state_temp.append(req_workflow)
collect_state_temp.append(req_datetime)
if req_workflow_mem == "Open" and req_workflow == "Closed" and req_id_mem == req_id:
req_workflow_mem = req_workflow
collect_state_temp.append(req_workflow)
collect_state_temp.append(req_datetime)
collect_state_main.append(collect_state_temp)
collect_state_temp = []
数据框:
TICKET_ID | 日期时间标准 | 状态 |
---|---|---|
79355138 | 9/3/2024 11:54:18 上午 | 打开 |
79355138 | 9/3/2024 9:01:12 下午 | 打开 |
79355138 | 9/6/2024 4:52:10 下午 | 已关闭 |
79355138 | 9/6/2024 4:52:12 下午 | 打开 |
79355138 | 9/10/2024 4:01:24 下午 | 已关闭 |
79446344 | 8/27/2024 1:32:54 下午 | 打开 |
79446344 | 9/11/2024 9:40:17 上午 | 已关闭 |
79446344 | 9/11/2024 9:40:24 上午 | 已关闭 |
79446344 | 9/11/2024 9:42:14 上午 | 打开 |
结果:
我的问题是我陷入困境,因为配对可能会发生两次以上。我在 sql 中尝试了 Rank,但它只返回第一个配对实例,而不返回其他配对
一种方法:
SELECT
FOD.TICKET_ID
, FOD.FIRSTOPENDATETIME
, (SELECT NC.DATETIMESTANDARD
from MyTbl NC -- Nearest future close date
where NC.TICKET_ID=FOD.TICKET_ID
and NC.STUS='Closed'
and NC.DATETIMESTANDARD>FOD.FIRSTOPENDATETIME
and DATETIMESTANDARD=(select min(DATETIMESTANDARD)
from MyTbl NCb
where NCb.TICKET_ID=NC.TICKET_ID
and NCb.STUS='Closed'
and NCb.DATETIMESTANDARD > FOD.FIRSTOPENDATETIME)
) as NearestFutureClosedDate
from (select TICKET_ID
, MIN(DATETIMESTANDARD) as FIRSTOPENDATETIME
from MyTbl
group by TICKET_ID) as FOD
主查询为每个工单选择最早的 Open 行,子查询查找这些行之后最早的 Closed 行。
您没有提供 sqlfiddle 链接, 甚至也不提供您当前尚未运行的 SQL。 我同意你的观点,RANK() 不是这项工作的最佳工具。
您正在寻找的是自加入。 你想要建立一种关系 (至少)ticket_id、open_time、close_time 列。 对于待处理的票证,最后一列当然将为 NULL。 对于表别名
a
和 b
,施加一个 a.datetimestandard < b.datetimestandard
约束。
注意创建复合索引
如果您愿意,请点击 (ticket_id, datetimestandard)
一个高性能的查询计划。