【问题标题】:How to calculate the Average days with the Unpivot function如何使用 Unpivot 函数计算平均天数
【发布时间】:2022-11-14 05:08:40
【问题描述】:

我正在尝试计算每个工作流程的平均天数。

试试看

DROP TABLE IF EXISTS #ProcessLog;
GO

CREATE TABLE #ProcessLog
(
WorkFlow        VARCHAR(100),
ExecutionDate   DATE,
PRIMARY KEY (WorkFlow, ExecutionDate)
);
GO

INSERT INTO #ProcessLog VALUES
('Alpha','6/01/2018'),('Alpha','6/14/2018'),('Alpha','6/15/2018'),
('Bravo','6/1/2018'),('Bravo','6/2/2018'),('Bravo','6/19/2018'),
('Charlie','6/1/2018'),('Charlie','6/15/2018'),('Charlie','6/30/2018');
GO

我找到了一个使用 INNER JOIN 函数的解决方案,但我想知道是否有更简单的方法,例如 PIVOT 或 UNPIVOT 或 Window 函数?

WITH cte as ( SELECT ROW_NUMBER() OVER(ORDER by Workflow) as n, * 
              FROM       #ProcessLog as p1 )

SELECT cte.workflow, (abs(DATEDIFF(DAY, cte.ExecutionDate, cte2.ExecutionDate))
      + abs(DATEDIFF(DAY, cte2.ExecutionDate, cte3.ExecutionDate)) ) / 2 as average_days
FROM       CTE  
INNER JOIN CTE as cte2  ON cte.n +1 = cte2.n  AND cte.WorkFlow  = cte2.WorkFlow
INNER JOIN CTE as cte3  ON cte2.n +1 = cte3.n AND cte2.WorkFlow = cte3.WorkFlow  

【问题讨论】:

    标签: sql sql-server window-functions date-arithmetic


    【解决方案1】:

    您需要 CTE 中日期的 LAG 并且可以使用 DATEDIFF

    DROP TABLE IF EXISTS #ProcessLog;
    
    
    CREATE TABLE #ProcessLog
    (
    WorkFlow        VARCHAR(100),
    ExecutionDate   DATE,
    PRIMARY KEY (WorkFlow, ExecutionDate)
    );
    
    
    INSERT INTO #ProcessLog VALUES
    ('Alpha','6/01/2018'),('Alpha','6/14/2018'),('Alpha','6/15/2018'),
    ('Bravo','6/1/2018'),('Bravo','6/2/2018'),('Bravo','6/19/2018'),
    ('Charlie','6/1/2018'),('Charlie','6/15/2018'),('Charlie','6/30/2018');
    
    WITH CTE As(
      SELECT
      WorkFlow
      ,ExecutionDate
      ,  LAG(ExecutionDate) OVER(PARTITION BY WorkFlow ORDER BY ExecutionDate) date2 
      FROM
      #ProcessLog)
    SELECT WorkFlow,AVG(DATEDIFF(day, date2,ExecutionDate)) FROM CTE GROUP BY WorkFlow
    
    WorkFlow (No column name)
    Alpha 7
    Bravo 9
    Charlie 14

    【讨论】:

    • 很好的主意。简单而简短。
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多