如何使用SQL计算相同键/ID下同一列多行数值的差值?
SQL实现相同ID下日期差值计算
问题
- 如何基于相同键对同一列的两行数值进行相减?
- 如何提取相同ID下多行指定列的差值?
示例表结构及数据
| id | prev_val | new_val | date |
|---|---|---|---|
| 1 | 0 | 1 | 2020-01-01 10:00:00 |
| 1 | 1 | 2 | 2020-01-01 11:00:00 |
| 2 | 0 | 1 | 2020-01-01 10:00:00 |
| 2 | 1 | 2 | 2020-01-02 10:00:00 |
预期结果
| id | duration_in_hours |
|---|---|
| 1 | 1 |
| 2 | 24 |
说明:ID为1时,两个date值的差值为1小时;ID为2时,差值为24小时。
解决方案
完全可以用SQL实现,以下提供两种常用方案:
方案1:分组聚合计算首尾日期差(适合每个ID仅需最早/最晚差值)
如果每个ID的目标是计算最早和最晚日期的间隔,直接通过分组聚合即可:
SELECT id, TIMESTAMPDIFF(HOUR, MIN(date), MAX(date)) AS duration_in_hours FROM your_table GROUP BY id;
方案2:窗口函数计算相邻行差值(适合多行间逐行计算)
如果ID下有多行数据,需要计算相邻行的日期差,用LAG()窗口函数获取上一行的日期值:
WITH ranked_dates AS ( SELECT id, date, LAG(date) OVER (PARTITION BY id ORDER BY date) AS prev_date FROM your_table ) SELECT id, TIMESTAMPDIFF(HOUR, prev_date, date) AS duration_in_hours FROM ranked_dates WHERE prev_date IS NOT NULL;
不同SQL方言适配
- MySQL/MariaDB:使用
TIMESTAMPDIFF(HOUR, start_date, end_date) - PostgreSQL:用
EXTRACT(EPOCH FROM (end_date - start_date)) / 3600计算小时差 - SQL Server:使用
DATEDIFF(HOUR, start_date, end_date)
内容的提问来源于stack exchange,提问作者Forece85
相关产品推荐
相关产品推荐

