【问题标题】:How to join a table to a changelog table?如何将表连接到更改日志表?
【发布时间】:2021-08-20 21:42:09
【问题描述】:

我有两个与工单相关的表格,DimTickets,并且想要计算从 CreatedDateTime 到状态首次更改为 Done/Released 之间的时间。 DimTickets 表的结构如下:

IssueKey IssueType Priority Project Status CreatedDateTime
TEAM1-100 Story High Team 1 Approved for Release 2020-04-02 16:09:45
TEAM1-101 Task Medium Team 1 Done 2020-04-03 15:38:25
TEAM1-102 Sub-task Low Team 1 Done 2020-04-08 09:03:43
TEAM1-103 Bug High Team 1 In Progress 2020-04-13 12:18:56
TEAM1-104 Task Medium Team 1 Done 2020-04-16 11:40:08
TEAM2-100 Task Medium Team 2 Done 2020-04-17 09:06:17
TEAM2-101 Story Medium Team 2 Released 2020-04-17 15:55:45
TEAM2-102 Task Low Team 2 Done 2020-04-20 10:12:41
TEAM1-105 Task High Team 1 In Progress 2020-04-20 15:24:56

还有一个 DimTicketChangelog,其结构如下:

ChangeLogID IssueKey FromStatus ToStatus ChangeLogDateTime
1 TEAM1-100 1 2 2019-06-14 15:56:03
2 TEAM1-100 2 3 2019-06-15 12:58:29
3 TEAM2-102 2 4 2019-06-16 17:58:48
4 TEAM1-100 3 5 2019-06-16 20:01:43
5 TEAM1-104 1 3 2019-06-18 10:02:39
6 TEAM1-105 4 5 2019-06-21 18:03:19
7 TEAM1-104 3 5 2019-06-24 22:05:28
8 TEAM2-102 4 6 2019-07-02 08:06:50
9 TEAM2-103 1 4 2019-07-04 11:06:50

有没有办法让我在第一次将工单从状态

【问题讨论】:

  • 创建一个CTE,过滤到状态5+并使用排名

标签: sql-server tsql join


【解决方案1】:

这样的东西应该可以工作

说明:您将使用 CTE 查找工单从 编辑:我添加了一个日期差异以满足您对花费的时间。就这些日期而言,您的示例数据有点有趣,但使用您的真实数据应该没问题。

;WITH FindFirstChange AS (
    select 
         t.IssueKey  /*Add whatever other columns you need here*/
         ,t.createdDateTime
         ,tcl.ChangeLogDateTime
         ,DATEDIFF(day, t.createdDateTime ,tcl.ChangeLogDateTime) Diff
        ,ranking = ROW_NUMBER() OVER(PARTITION BY tcl.issuekey ORDER BY tcl.ChangeLogDateTime ASC)
    FROM DimTickets t
    INNER JOIN DimTicketchangelog tcl ON t.issuekey = tcl.issuekey 
    WHERE tcl.fromStatus <5 
    AND toStatus >= 5
)
SELECT *
FROM FindFirstChange
WHERE ranking = 1;

【讨论】:

    【解决方案2】:

    您没有提供任何预期的结果,并且您的测试数据并没有真正涵盖您描述的标准,而且您的日志表日期早于每张票的 createDate,这没有任何意义?!但是,请查看以下内容是否适合您:

    with l as (
        select issuekey,changelogdatetime, Row_Number() over(partition by issueKey order by ChangeLogID) rn
        from DimTicketChangeLog
        where tostatus in (5,6) and FromStatus<5
    )
    select t.*, DateDiff(day,t.createddatetime,l.ChangeLogDateTime) Duration
    from DimTickets t 
    left join l on l.IssueKey=t.IssueKey
    where l.rn=1 
    

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多