您可以为此使用WIDTH_BUCKET函数。这适用于数字和日期时间值。
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 组。
结果:
| 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 子句中使用此组 no。
编辑
在不更改分区数量的情况下无法扩展最大限制。最好使用这样的东西。
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;