计算SQL中的行之间花费的时间
Posted
技术标签:
【中文标题】计算SQL中的行之间花费的时间【英文标题】:Calculating time taken between rows in SQL 【发布时间】:2021-02-03 00:52:13 【问题描述】:我是 SQL 新手,因此是这个问题。我有下表。
id | prev_state | curr_state | start_curr_state |selected_to_interview|interview_to_selected|
1 | APPLICANT. | INTERVIEW | 2020-10-12. | ? |
2 | NULL | APPLICANT. | 2020-10-16 | NULL | NULL. |
1 | INTERVIEW. | SELECTED. | 2020-1--20. | NULL | ? |
我有一组 3 个预先确定的候选状态 - APPLICANT
、INTERVIEW
和 SELECTED
。
该表提供了从一个阶段过渡到另一个阶段的候选人的记录。
start_curr_state 是当前状态的开始日期 - 采访状态的第 1 行开始。
根据转换的状态,我需要计算每个阶段转换所需的时间。
我知道时间是日期差异 start_curr_state
对于 prev_state
- start_curr_state
但我不确定如何计算这个。任何帮助表示赞赏。
【问题讨论】:
请标记数据库平台 @OldProgrammer 已更新 你需要展示你的最终答案应该是什么样子,这样很明显你的问题是完整的。从表面上看,一个简单的带有窗口函数的递归 CTE 就可以做到,但不知道输出是什么,无法为您提供明确的 sql。 【参考方案1】:你可以使用LAG()
,我假设你每个人都有一个名为“candidateid”的密钥:
select t1.*
, CASE WHEN t1.curr_state = 'INTERVIEW' AND prev_state = 'APPLICANT'
THEN datediff( lag(t1.start_curr_state) over (partition by t1.candidateid order by t1.start_curr_state) ,t1.start_curr_state)
ELSE NULL END selected_to_interview
from tablename t1
【讨论】:
如果您可以在 switch case 中为特定情况(如 slected_to_interview)编写此代码,这将非常有帮助。我是 SQL 新手,但我仍在努力思考这项新的学习。 @TannishaHill 'slected_to_interview' 怎么样。请解释整个逻辑(可能在您的问题中提供示例。 我的意思是逻辑类似于existing_table.withColumn("applicant_to_interview", when($"prev_state" === "APPLICANT" && $"curr_state" === "INTERVIEW, <this_lag_logic>).otherwise(0)
没有连接,APPLICANT 和 INTERVIEW 是当前状态在同一个表中的不同行。
是的,我看了你的评论后修好了【参考方案2】:
您有两个问题:第一个是在您的数据库中执行“datediff”。这是一个简单的问题 第二个是善用Windows Function的经典问题: 具体来说就是LAG windows函数的使用。
从代码中看这个例子(在提到的链接中):
SELECT id, --assumes it's the applicant id
START_CURR_STATE,
CURR_STATE,
START_CURR_STATE-LAG(START_CURR_STATE, 1) OVER
(PARTITION BY id ORDER BY CURR_STATE)
AS difference
FROM TABLE
(假代码)
请注意:由于您的 CURR_STATE 可以按字母顺序正确排序,因此有效! 另外,有时你可以做 DATE-DATE,有时你需要使用诸如 (DATEDIFF) 之类的函数。这取决于您的 SQL 平台,因此您需要查找它
【讨论】:
以上是关于计算SQL中的行之间花费的时间的主要内容,如果未能解决你的问题,请参考以下文章