您可以为此使用WIDTH_BUCKET 函数。
这适用于 numbers 和日期时间值。
SQL Fiddle 上的演示
查询:
select date_column,
width_bucket(date_column,date'2013-08-05',date'2013-08-14',3) grp
from mytable
order by date_column
这里从 8 月 5 日 00:00:00 到 8 月 14 日 00:00:00 之间的日期分为 3 组。
- 第一组是从 8 月 5 日 00:00:00 到 8 月 7 日 23:59:59。
- 第二次从 8 月 8 日 00:00:00 到 8 月 10 日 23:59:59。
- 第三次从 8 月 11 日 00:00:00 到 8 月 13 日 23:59:59。
- 从 8 月 14 日 00:00:00 开始的任何事件都将具有第 4 组。
- 8 月 5 日 00:00:00 以下的任何内容都将具有第 0 组。
Results:
| DATE_COLUMN | GRP |
---------------------------------------
| August, 04 2013 23:59:59+0000 | 0 |
| August, 05 2013 00:00:00+0000 | 1 |
| August, 06 2013 00:00:00+0000 | 1 |
| August, 07 2013 00:00:00+0000 | 1 |
| August, 07 2013 23:59:59+0000 | 1 |
| August, 08 2013 00:00:00+0000 | 2 |
| August, 09 2013 00:00:00+0000 | 2 |
| August, 10 2013 00:00:00+0000 | 2 |
| August, 11 2013 00:00:00+0000 | 3 |
| August, 12 2013 00:00:00+0000 | 3 |
| August, 13 2013 00:00:00+0000 | 3 |
| August, 13 2013 23:59:59+0000 | 3 |
| August, 14 2013 00:00:00+0000 | 4 |
你可以在你的 partition by 子句中使用这个组号。
编辑
在不更改分区数的情况下无法扩展最大限制。最好使用this 之类的东西。
select date_column, ceil((trunc(date_column) - date'2013-08-04')/3) grp
from mytable
where date_column >= date'2013-08-05'
order by date_column;