【问题标题】:Joining Rows in a Single Table With Unwanted Results将单个表中的行与不需要的结果连接起来
【发布时间】:2021-04-01 14:45:25
【问题描述】:

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

我有下表:

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。

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

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

【问题讨论】:

  • 从该查询的外观来看,您的问题明显过于复杂。示例数据和预期结果将真正帮助我们为您提供帮助,以及您要解决的问题的描述。
  • 助您一臂之力,化繁为简! minimal reproducible example
  • @Larnu 我已经尝试按照您的建议进行操作。这样更好吗?
  • 2/1/2021 是从哪里来的 Source ID=2 以及为什么您的预期结果中缺少 Source ID=4
  • @forpas 感谢您指出这一点!在我尝试简化时,我错过了输入一些数据。 2/1/2021 来自第一个表,其中源 id 2 于 2021 年 2 月 1 日进行了审核。我在表格中添加数据是否解决了您的问题?感谢您的帮助!

标签: sql sql-server database sorting ssms


【解决方案1】:

使用自联接和聚合:

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

【讨论】:

  • 你太棒了!!!我不能说谢谢你在这方面的帮助!!!
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 2021-09-28
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多