【问题标题】:SQL Query to find average of difference between datesSQL查询以查找日期之间差异的平均值
【发布时间】:2011-09-21 09:20:46
【问题描述】:

我有一列包含类似的数据

Date
13/8/2011
2/9/2011
10/9/2011
20/9/2011

我需要编写一个 SQL 查询/程序来帮助我获得日期之间差异的平均值。 对于上面的示例,它将是 (19+8+10)/3=12.33 请帮忙。

提前致谢, 吉萨

【问题讨论】:

  • 19+8+10从何而来?
  • 我假设日期之间的差异,即 2011 年 13 月 8 日到 2011 年 2 月 9 日是 19 天,等等。我假设日期是排序的,并且每个日期都应该与其进行比较邻居。

标签: sql date average


【解决方案1】:

试试这个:

SELECT DATEDIFF(
    day, 
    MIN(date_col), 
    MAX(date_col)) / (COUNT(date_col)-1) AS mean_val
FROM your_table

感谢 ypercube 的建议:

SELECT
  CASE
    WHEN COUNT(date_col) < 2 THEN 0
    ELSE DATEDIFF(
        day, 
        MIN(date_col), 
        MAX(date_col)) / (COUNT(date_col)-1)
  END
  as mean_val
FROM your_table

【讨论】:

  • 你的意思是/ ( COUNT(date_col)-1 )
  • 我花了很长时间才意识到为什么会这样。很好的问题分析。
  • @Geethapriya.VC:你也可以稍微改变一下,使用CASE,以处理计数为0或1的情况。
  • @ypercube:我更改了帖子以反映您的建议;你认为正确吗?再次感谢
  • 是的,没关系。我不确定所有 RDBMS 是否都需要它。只是为了选择退出任何错误消息。
【解决方案2】:

我不知道您的 RDBMS,但这是来自 SQL Server。此外,您的计算结果之一是错误的 - 02/09/2011 - 13/08/2011 是 20,而不是 19。

create table dates (
    myDate  date
)

insert into dates
values ({d '2011-08-13'}), 
    ({d '2011-09-02'}), 
    ({d '2011-09-10'}), 
    ({d '2011-09-20'})

;with orderedDates as (
    select ROW_NUMBER() OVER (order by myDate) as row, myDate
    from dates
), datediffs as (
    select DATEDIFF(dd, o2.myDate, o1.myDate) as diff
    from orderedDates o1 left outer join
        orderedDates o2 on o1.row = o2.row + 1
)
select AVG(cast(diff as decimal))
from datediffs
where diff is NOT NULL

产生的结果是 12.667: (20 + 8 + 10)/3。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多