【问题标题】:count occurrences for each week using db2使用 db2 计算每周的发生次数
【发布时间】:2014-06-17 13:35:28
【问题描述】:

我正在寻找一些一般性建议而不是解决方案。我的问题是我有一个每个人的日期列表,由于管理程序,一个人可能为此一个实例存储了多个记录,但记录的日期是当这个人通过纸质记录时输入数据的时间.我知道这很难解释,所以我举个例子:

Person     Date            Audit
------     ----            -----
1          2000-01-01      A
1          2000-01-01      B
1          2000-01-02      C
1          2003-04-01      A
1          2003-04-03      A

我想知道一个人有多少有效记录,方法是删除将日期记录为输入数据的日期的烦人审计,而不是该人第一次到达数据集中的日期。所以对于上面的人我只感兴趣:

Person     Date            Audit
------     ----            -----
1          2000-01-01      A
1          2003-04-01      A

让这个问题变得困难的是我没有审计栏的奢侈(这里的审计栏只是为了展示如何收集数据)。我只有约会。因此,我可以粗略统计真实事件(并删除重复审计数据)的一种方法是查看一个人历史中的各个星期,如果给定星期存在记录,则将 1 添加到我的计数器。这样,即使在几天内拆分了多条记录,我也只会将连续的日期计算为一条记录(毕竟我是按日期计算的)。

那么有谁知道任何可以帮助我解决这个问题的 db2 函数?

【问题讨论】:

  • 当您说 week 时,您是指标准周周一至周日还是任何 7 天间隔?
  • 理想情况下,它是一个滑动窗口,其中一周由第一条记录(因此日期)校准 - 您可以在其中展望一周。但是,这可能会非常困难,并且可以接受必须使用标准周。

标签: sql db2


【解决方案1】:

如果你能忍受标准周,那就很简单了:

select 
  person, year(dt), week(dt), min(dt), min(audit) 
from 
  blah 
group by 
  person, year(dt), week(dt)

如果您需要从第一个日期开始的 7 天范围,则需要生成自己的周数,例如日历,例如像这样:

with minmax(mindt, maxdt) as ( -- date range of the "calendar"
  select min(dt), max(dt) 
  from blah
), 
cal(dt,i) as ( -- fill the range with every date, count days
  select mindt, 0 
  from minmax 
 union all 
  select dt+1 day , i+1 
  from cal 
  where dt < (select maxdt from minmax) and i < 100000
) 
select 
  person, year(blah.dt), wk, min(blah.dt), min(audit)  
from 
  (select dt, int(i/7)+1 as wk from cal) t -- generate week numbers
inner join 
  blah 
    on t.dt = blah.dt 
group by person, year(blah.dt), wk

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2013-03-06
    • 2023-03-04
    • 2014-05-14
    • 2020-12-05
    • 2022-08-18
    相关资源
    最近更新 更多