sql - 使用 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
解决方案
您可以使用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;
推荐阅读
- php - CodeIgniter - “发生数据库错误”(控制器/Login.php)
- php - 将结果包装在表中
- matplotlib - Matplotlib subplot2grid 在设置 gridspec_kw width_ratios 时移除子图
- python - 如何在 Python 3 中正确包装字典?
- c++ - 如何从 Windows 10 窗口中删除不可见的边框
- webserver - 如何通过重写规则将 url 重定向到错误页面
- javascript - 语义 ui 下拉菜单活动项未更新
- segmentation-fault - 分段错误 ret2libc 攻击
- python - 如何使用 s3fs 处理大文件?
- android - ViewHolder 点击正在弄乱其他视图