【问题标题】:How to group 3 days in one group by using dense_rank() sql如何使用dense_rank()sql将3天分组为一组
【发布时间】:2013-08-22 08:17:26
【问题描述】:

我需要 sql 在一个小组中进行 3 天。像

这样的意思
4 Aug 2013 - 6 Aug 2013 as first group..
7 Aug 2013 - 9 Aug 2013 as second group..
10 Aug 2013 - 12 Aug 2013 as third group..

假设现在是 8 月 8 日,

5 Aug- 7 Aug group in first group
8 Aug - 10  group as second group
11 Aug - 13 Aug as third group

这是我的部分代码:

dense_rank() over (partition by **[3 days]**) order by wip.CURRENT_OPER desc)
as date_priority2,

【问题讨论】:

  • 您使用的是哪个DBMS(MySQL、Oracle、...)

标签: sql oracle


【解决方案1】:

您可以为此使用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;

【讨论】:

  • 嗨..谢谢它的作品!但我仍然想在 8 月 14 日之后将 date_column 分组为 3 天......例如:8 月 14 日至 8 月 16 日作为第 4 组、8 月 17 日至 8 月 19 日作为第 5 组、8 月 20 日至 8 月 22 日作为第 6 组......跨度>
  • 哎呀。那可能是不可能的。你必须做一些类似于 Kaf 的回答。
【解决方案2】:

你也可以尝试这样的事情(没有排名功能):

declare @firstday int = datediff(day,0,'20130804'), 
        @days_per_group int = 3

select mydate,
    (datediff(day,0,mydate)-@firstday) /@days_per_group + 1 as date_priority2
from t

Fiddle demo

|     MYDATE | DATE_PRIORITY2 |
-------------------------------
| 2013-08-04 |              1 |
| 2013-08-05 |              1 |
| 2013-08-06 |              1 |
| 2013-08-07 |              2 |
| 2013-08-08 |              2 |
| 2013-08-09 |              2 |
| 2013-08-10 |              3 |
| 2013-08-11 |              3 |
| 2013-08-12 |              3 |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多