我试图用SQL做到这一点。我有一个包含transaction_date
的交易表。按日期分组后,我得到了这个列表:
| transaction_date |
| 2019-03-01 |
| 2019-03-04 |
| 2019-03-05 |
| ... |
从这3个交易日期,我想实现:
有没有好的语法?在我使用WHILE迭代所有这些之前。
提前致谢
如果你的mysql版本不支持lag
或lead
函数。
您可以尝试使列使用子查询来获取下一个DateTime。然后使用DATEDIFF
来获取子查询中的日期差距。
查询1:
SELECT avg(diffDt),min(diffDt),MAX(diffDt)
FROM (
SELECT DATEDIFF((SELECT transaction_date
FROM T tt
WHERE tt.transaction_date > t1.transaction_date
ORDER BY tt.transaction_date
LIMIT 1
),transaction_date) diffDt
FROM T t1
) t1
| avg(diffDt) | min(diffDt) | MAX(diffDt) |
|-------------|-------------|-------------|
| 2 | 1 | 3 |
如果您的mysql版本高于8.0,您可以尝试使用LEAD
窗口函数而不是子查询。
查询#1
SELECT avg(diffDt),min(diffDt),MAX(diffDt)
FROM (
SELECT DATEDIFF(LEAD(transaction_date) OVER(ORDER BY transaction_date),transaction_date) diffDt
FROM T t1
) t1;
| avg(diffDt) | min(diffDt) | MAX(diffDt) |
| ----------- | ----------- | ----------- |
| 2 | 1 | 3 |