首页 > 解决方案 > 使用 SQL Server 2012 如何遍历未知数量的行并计算日期差异

问题描述

如果每个 ID 有两个或多个日期,我需要计算平均天数:date1 和 date2、date2 和 date3 之间的天数等。输出需要是每个 ID 每个间隔之间的平均天数。我正在寻找一种解决方案,它遍历每个 ID 的每个日期,然后平均天数

我可以通过 id 创建行号和分区,但在实际数据中,每个 ID 最多可以有 20 行。

CREATE TABLE #ATABLE(
ID   INTEGER  NOT NULL  
,DATE DATE  NOT NULL
);
INSERT INTO #ATABLE(ID,DATE) VALUES (1,'1/1/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/1/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/10/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/20/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/30/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (3,'1/1/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (3,'1/10/2019');

--get avg days between orders

DROP TABLE #ATABLE

上述输出将是:

ID  AvgDatediff
1   Null
2   10
3   9

标签: sqlsql-serverselectsql-server-2012iteration

解决方案


您可以使用lag获取上一行(每行),然后找到它与当前行之间的差异。然后,您可以平均它们:

SELECT   id, AVG(diff)
FROM     (SELECT id,
                 DATEDIFF(DAY, date, LAG(date) OVER (PARTITION BY id 
                                                     ORDER BY date DESC)) AS diff
          FROM #atable) t
GROUP BY id;

推荐阅读