使用db2计算每周的出现次数

时间:2014-06-17 13:35:28

标签: sql db2

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

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函数?

1 个答案:

答案 0 :(得分:1)

如果你能活到标准周,那很简单:

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

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

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