将 python 逻辑转换为 sql 查询(将一列中的两个状态配对)

问题描述 投票:0回答:2

我需要帮助将我的 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 上午 打开

结果:

  1. 它将识别 TICKET_ID 的第一个 Open 状态并查找最接近的 Closed 状态
  2. 它将针对每种情况重申寻找开盘和闭盘对(仅考虑首次开盘和首次收盘)

我的问题是我陷入困境,因为配对可能会发生两次以上。我在 sql 中尝试了 Rank,但它只返回第一个配对实例,而不返回其他配对

python sql pandas
2个回答
1
投票

一种方法:

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 行。


0
投票

您没有提供 sqlfiddle 链接, 甚至也不提供您当前尚未运行的 SQL。 我同意你的观点,RANK() 不是这项工作的最佳工具。

您正在寻找的是自加入。 你想要建立一种关系 (至少)ticket_id、open_time、close_time 列。 对于待处理的票证,最后一列当然将为 NULL。 对于表别名

a
b
,施加一个
a.datetimestandard < b.datetimestandard
约束。 注意创建复合索引 如果您愿意,请点击
(ticket_id, datetimestandard)
一个高性能的查询计划。

© www.soinside.com 2019 - 2024. All rights reserved.