【问题标题】:database db2: Group by custom date range数据库 db2:按自定义日期范围分组
【发布时间】:2015-02-26 12:25:58
【问题描述】:

我在 db2 中有一个包含列的表:

PK (varchar)
COLUMN1 (VARCHAR)
..
..
..
CREATION_TIMESTAMP (TIMESTAMP)

我需要基于自定义日期范围的计数,例如每五天。 我将从“2014 年 12 月 1 日”这样的一天开始,然后根据 5 天的间隔对我的计数进行分组:

group 1 : Dec 1 to Dec 5
group 2 : Dec 6 to Dec 10
...
...
and so on.

如果我必须按预先定义的范围进行分组,这很容易;我可以简单地做

select count(*), week(CREATION_TIMESTAMP) 
from  MYTABLE 
group by week(CREATION_TIMESTAMP);

日、月、年等类似。但是有什么方法可以定义如上所述的自定义范围吗?

【问题讨论】:

  • 你可以写一个函数。

标签: sql group-by db2


【解决方案1】:

您需要一个将 creation_time 映射到您想要的时间间隔的函数。比如:

select monthname(CREATION_TIMESTAMP)
     , day(CREATION_TIMESTAMP) + 1 - mod(day(CREATION_TIMESTAMP),5)
     , count(1)
from ...
group by monthname(CREATION_TIMESTAMP)
    , day(CREATION_TIMESTAMP) + 1 - mod(day(CREATION_TIMESTAMP),5)

例子:

with t(n) as  ( values date('2014-12-01') 
                union all 
                select n + 1 day from t 
                where n < '2014-12-20'
              ) select distinct day(n) + 1 - mod(day(n),5), day(n) + 5 - mod(day(n),5) 
                from t;

1           2          
----------- -----------
SQL0347W  The recursive common table expression "LELLE.T" may contain an 
infinite loop.  SQLSTATE=01605

      1           5
      6          10
     11          15
     16          20
     21          25

编辑:扩展示例

with t(n) as  ( 
    values date('2014-12-01') 
    union all 
    select n + 1 day 
    from t where n < '2014-12-20' 
) 
select day(n)
     , mod(day(n),5)
     , day(n) + 1 - mod(day(n),5) 
from t

      1           1           1
      2           2           1
      3           3           1
      4           4           1
      5           0           6
      6           1           6
      7           2           6
      8           3           6
      9           4           6
     10           0          11
     11           1          11
     12           2          11
     13           3          11
     14           4          11
     15           0          16
     16           1          16
     17           2          16
     18           3          16
     19           4          16
     20           0          21

【讨论】:

  • 看起来它给出了想要的输出,但是你能解释一下day(CREATION_TIMESTAMP) + 1 - mod(day(CREATION_TIMESTAMP),5)这个表达式在做什么吗?
  • day(CREATION_TIMESTAMP) 是一个月中的哪一天,例如今天是 30。 mod(x,5) 是除以 5 时的模余数。 mod(16,5) 是 1,因为 16 - (3*5) = 1。例如:en.wikipedia.org/wiki/Modulo_operation 通过减去 mod(x,5)从 x 开始,我们将它分成 5 个一组。如果你扩展我上面的例子,也许最容易看到。我会编辑答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
相关资源
最近更新 更多