繁体   English   中英

SQL Server 查询返回两行中的日期与 OUTPUT 中的初始状态列之间的差异

[英]SQL Server query to return difference between dates in two rows and initial status column in OUTPUT

我有两个表, current_perf_rat and history_perf_rat

  • current_perf_rat包含 PersonRatingID、FirstName、LastName、Email、CurrentStatusID 列
  • history_perf_rat包含 PersonRatingID、StatusID、StatusName、StatusTimestamp、isCurrent 列

current_perf_rat

人员评级ID 电子邮件 当前状态ID
123 许愿 拥抱 xyz@gmail.com 678
456 史密斯 约翰 史密斯@xyz.com 746

history_perf_rat:

人员评级ID 状态ID 状态名称 状态时间戳 是当前
123 678 给出的评级 2021-10-01 10:00
123 746 草稿评级 2021-09-28 15:00 N
123 567 开始评分 2021-09-01 02:00 N
456 678 给出的评级 2021-08-13 22:00
456 746 草稿评级 2021-09-17 15:00 N
456 567 开始评分 2021-08-01 02:00 N
456 561 初始评级 2020-08-01 02:00 N

我想创建一个查询,以了解仅在 2021 年,应用程序从所有人员评级 ID 的第一个状态移动到下一个状态需要多长时间。

下面的查询为我提供了行详细信息及其行号 -

SELECT DISTINCT
    current_perf_rat.PersonRatingID,
    history_perf_rat.StatusName,
    CAST(history_perf_rat.StatusTimestamp AS DATE) Application_date,
    ROW_NUMBER() OVER (ORDER BY history_perf_rat.StatusTimestamp ASC) rn
FROM 
    current_perf_rat, history_perf_rat
WHERE 
    current_perf_rat.PersonRatingID  = history_perf_rat .PersonRatingID 
    --and current_perf_rat.PersonRatingID =123 -- only one rating
ORDER BY
    history_perf_rat.StatusTimestamp ASC

这给了我想要使用的输出 -

人员评级ID 状态名称 申请日期
456 开始评分 2021-08-01 2
456 初始评级 2020-08-01 1
123 草稿评级 2021-09-28 2
123 开始评分 2021-09-01 1

预期输出:

人员评级ID 状态名称 花的时间
456 初始评级 1年
123 开始评分 1年28天
  • 如何修改这个 SQL 语句来获取这两个日期和初始状态名称之间的差异,即“Initiated Rating”和 started rating ? 有没有办法通过使用 LAG 或其他方法来做到这一点?

  • 另外,如何添加条件(参数)以便我可以选择应该执行此操作的年份?

例如,在上面 456 的结果中,上面也包含了 2020 时间戳,但我只想包含 2021。这可以动态完成吗?

您可以使用ROW_NUMBER仅获取第一行,并使用LEAD获取第一行之后的下一个Timestamp

SELECT
  h.PersonRatingID,
  h.StatusName,
  Time_Taken = DATEDIFF(day, StatusTimestamp, NextTime)
FROM (
    SELECT *,
      NextTime = LEAD(h.StatusTimestamp)
                        OVER (PARTITION BY h.PersonRatingID ORDER BY h.StatusTimestamp),
      rn = ROW_NUMBER() OVER (PARTITION BY h.PersonRatingID ORDER BY h.StatusTimestamp)
    FROM history_perf_rat h
    WHERE h.StatusTimestamp >= '2021-01-01'
) h
WHERE h.rn = 1;

数据库<>小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM