Sql 使用db2统计每周发生的事件

Sql 使用db2统计每周发生的事件,sql,db2,Sql,Db2,我在寻求一些一般性的建议,而不是解决办法。我的问题是,我有一个每个人的日期列表,由于管理程序的原因,一个人可能为这一实例存储了多个记录,但记录的日期是在该人通过书面记录时输入数据的日期。我理解这很难解释,因此我将举一个例子: Person Date Audit ------ ---- ----- 1 2000-01-01 A 1 2000-01-01 B 1 20

我在寻求一些一般性的建议,而不是解决办法。我的问题是,我有一个每个人的日期列表,由于管理程序的原因,一个人可能为这一实例存储了多个记录,但记录的日期是在该人通过书面记录时输入数据的日期。我理解这很难解释,因此我将举一个例子:

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函数可以帮助我解决这个问题吗?

如果你可以接受标准周,那么它非常简单:

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

当你说“周”时,你是指标准的星期一、星期一、星期日还是任何7天的间隔?理想情况下,这是一个滑动窗口,在该窗口中,一周由第一个记录和日期进行校准,在该窗口中,你展望一周的未来。然而,这可能会非常困难,并且会接受必须使用标准周。