【问题标题】:Calculate average, minimum, maximum interval between date计算日期之间的平均、最小、最大间隔
【发布时间】:2019-03-31 17:29:10
【问题描述】:

我正在尝试使用 SQL 来执行此操作。我有一个包含transaction_date 的事务表。按日期分组后,我得到了这个列表:

| transaction_date |
|    2019-03-01    |
|    2019-03-04    |
|    2019-03-05    |
|       ...        |

从这3个交易日期,我想实现:

  • 平均 = ((4-1) + (5-4)) / 2 = 2 天(每个日期计算 DATEDIFF)
  • 最少 = 1 天
  • 最长 = 3 天

有什么好的语法吗?在我使用 WHILE 迭代所有这些之前。

提前致谢

【问题讨论】:

  • 值 (4-1) + (5-4) 如何与您的数据样本相关? ..以及其他值???

标签: mysql sql


【解决方案1】:

如果你的mysql版本不支持laglead函数。

您可以尝试使列使用子查询来获取下一个日期时间。然后使用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

Results

| 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           |

View on DB Fiddle

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多