将行加入单个 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。
请耐心等待,我是自学成才的,所以我还在学习,所有的废话都不清楚。
我有以下 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。