【问题标题】:Get average duration per week-day from a list of records with start and end date从包含开始和结束日期的记录列表中获取每个工作日的平均持续时间
【发布时间】:2021-06-13 14:15:13
【问题描述】:

我有一个包含三列的输入表:

  • id => 字符串
  • start_date => 时间戳
  • end_date => 时间戳

我想获取每个工作日记录的平均持续时间(以秒为单位)(end_date - start_date)。

我的问题是:如果我有一个记录,其中 start_date 和 end_date 之间的间隔为 4 天,我想每天得到结果,不仅在 start_dateend_date,如果我之间没有记录以 3 周为例,将工作日的平均值视为“零”值。

例子:

id start_date end_date
1 (Friday to Sunday) 2021-03-12T01:00:00.000Z 2021-03-14T01:00:00.000Z
2 (Friday) 2021-03-12T01:00:00.000Z 2021-03-12T05:00:00.000Z
3 (Wed.) 2021-03-03T16:00:00.000Z 2021-03-03T17:00:00.000Z

预期结果(这里以欧洲工作日为例,星期日是 7 点):

weekday avg_duration_seconds
1 0
2 0
3 1800
4 0
5 48600
6 86400
7 3600

感谢您的帮助!

【问题讨论】:

  • 什么是weekday?这不在您的数据中,也未在问题中定义。
  • 星期几,1代表星期一,2代表星期二,... 7代表星期日
  • CockroachDB 或 Postgres。尽管 Cockroach 声称“兼容”,但它们与 Postgres 并不完全相同
  • 同意你的观点,但不是这里的主题。
  • 2021-03-02 是星期二,不是星期三,2021-03-11 是星期四,不是星期五

标签: sql postgresql cockroachdb


【解决方案1】:

注意:以下内容也适用于您标记的 Postgres。我不知道这是否也适用于 CockroachDB。

您可以使用generate_series() 将开始/结束时间戳“扩展”为天。要计算每一天的有效持续时间,需要将全天与开始和结束的部分天区别对待。一旦计算出这些时间戳,就很容易获得每天的持续时间。在所有工作日进行左连接并按他们分组:

select x.weekday, 
       avg(extract(epoch from real_end - real_start)) as duration
from generate_series(1,7) as x(weekday) 
left join (      
    select t.id, 
           extract(isodow from g.dt) as weekday,
           case  
             when start_date < g.dt then date_trunc('day', g.dt)
             else start_date
           end as real_start, 
           case 
             when end_date::date > g.dt then date_trunc('day', g.dt::date + 1)
             else end_date
           end as real_end
    from the_table t
      cross join generate_series(start_date, end_date, interval '1 day') as g(dt)
  ) t on x.weekday = t.weekday
group by x.weekday  
order by x.weekday;  

我不是 100% 我对“real_start”和“real_end”的表达涵盖所有极端情况,但它应该足以让你开始。

这与您的预期结果略有不同,因为您将 2021-03-02 和 2021-03-11 的工作日错误。

Online example

【讨论】:

  • 非常感谢,使用 from the_table t, generate_series(start_date, end_date, interval '1 day') as g(dt) 语法而不是交叉连接来处理 cockroach db
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多