将行加入单个 Table 并产生不需要的结果

Joining Rows in a Single Table With Unwanted Results

请耐心等待,我是自学成才的,所以我还在学习,所有的废话都不清楚。

我有以下 table:

Table (History h)
| Source ID | Action            | Created Date |
|  1        | Standard Filed    | 1/5/2021     |
|  2        | Standard Filed    | 1/7/2021     |
|  1        | Standard Reviewed | 1/7/2021     |
|  3        | Standard Filed    | 1/10/2021    |
|  4        | Standard Filed    | 1/15/2021    |
|  5        | Standard Filed    | 1/17/2021    |
|  4        | Standard Reviewed | 1/17/2021    |
|  1        | CPR Filed         | 1/18/2021    |
|  1        | CPR Reviewed      | 1/20/2021    |
|  3        | Standard Reviewed | 1/21/2021    |
|  2        | Standard Reviewed | 2/1/2021     |
|  5        | Standard Reviewed | 2/1/2021     |

我想要的结果是:

|Source ID | Filed Date | Reviewed Date | Difference |
|  1       | 1/5/2021   | 1/7/2021      | 2          |
|  1       | 1/18/2021  | 1/20/2021     | 2          |
|  2       | 1/7/2021   | 2/1/2021      | 25         |   
|  3       | 1/10/2021  | 1/21/2021     | 11         |   
|  4       | 1/15/2021  | 1/17/2021     | 2          | 
|  5       | 1/17/2021  | 2/1/2021      | 15         |           

然后我想得到这些结果并得到所有差异的平均值。所以标准或 CPR 项目从提交到审查平均需要多长时间。

所以上面例子的平均值是 9.5

我当前的查询语言是:

SELECT t1.SOURCE_ID, t1.CREATED_DATE AS 'Reviewed Date', t2.CREATED_DATE AS 'Filed Date', (DateDiff(hour,t2.CREATED_DATE,t1.CREATED_DATE)/24) AS 'Difference' 
    FROM ((SELECT h.SOURCE_ID, h.CHANGE_VALUE_FROM, h.CHANGE_VALUE_TO, h.CREATED_DATE FROM HISTORY AS h 
WHERE (h.CHANGE_VALUE_TO = 'Standard Reviewed' OR h.CHANGE_VALUE_TO = 'CPR Reviewed') AND (h.CREATED_DATE  >= '2021-01-01 00:00:00.000')) AS t1 
    INNER JOIN (SELECT h.SOURCE_ID, h.CHANGE_VALUE_FROM, h.CHANGE_VALUE_TO, h.CREATED_DATE FROM HISTORY as h 
WHERE (h.CHANGE_VALUE_TO = 'Standard Filed' OR h.CHANGE_VALUE_TO = 'CPR Filed') AND (h.CREATED_DATE  >= '2021-01-01 00:00:00.000')) AS t2 ON (t1.SOURCE_ID = t2.SOURCE_ID) AND (t1.CREATED_DATE >= t2.CREATED_DATE))
ORDER BY SOURCE_ID ASC;

我的结果是:

|SOURCE_ID| Filed Date | Reviewed Date | Difference |
|  1      | 1/5/2021   | 1/7/2021      | 2          |
|  *1     | 1/5/2021   | 1/20/2021     | 15         |
|  1      | 1/18/2021  | 1/20/2021     | 2          |
|  2      | 1/7/2021   | 2/1/2021      | 25         |
|  3      | 1/10/2021  | 1/21/2021     | 11         |
|  4      | 1/15/2021  | 1/17/2021     | 2          | 
|  5      | 1/17/2021  | 2/1/2021      | 15         | 

以上数据的平均值为 10.28。

所以有一排不应该出现。我已经用星号标记了它。

任何帮助,关于如何做的另一个想法,任何真的,都非常感谢。

使用自连接和聚合:

SELECT h1.Source_ID, h1.Created_Date Filed_Date,
       MIN(h2.Created_Date) Reviewed_Date,
       DATEDIFF(HOUR, h1.Created_Date, MIN(h2.Created_Date)) / 24 Difference
FROM History h1 INNER JOIN History h2
ON h2.Source_ID = h1.Source_ID AND h2.Created_Date > h1.Created_Date
AND ((h1.Action = 'Standard Filed' AND h2.Action = 'Standard Reviewed') 
  OR (h1.Action = 'CPR Filed' AND h2.Action = 'CPR Reviewed'))
WHERE h1.Created_Date >= '2021-01-01 00:00:00.000'  
GROUP BY h1.Source_ID, h1.Created_Date 

要获得平均差异,请使用上述查询和聚合创建一个 CTE:

WITH cte AS (
  SELECT h1.Source_ID, h1.Created_Date Filed_Date,
         MIN(h2.Created_Date) Reviewed_Date,
         DATEDIFF(HOUR, h1.Created_Date, MIN(h2.Created_Date)) / 24 Difference
  FROM History h1 INNER JOIN History h2
  ON h2.Source_ID = h1.Source_ID AND h2.Created_Date > h1.Created_Date
  AND ((h1.Action = 'Standard Filed' AND h2.Action = 'Standard Reviewed') 
    OR (h1.Action = 'CPR Filed' AND h2.Action = 'CPR Reviewed'))
  WHERE h1.Created_Date >= '2021-01-01 00:00:00.000'  
  GROUP BY h1.Source_ID, h1.Created_Date   
)
SELECT AVG(1.0 * Difference) average_difference
FROM cte 

参见demo