【问题标题】:Oracle Database Temporal Query Implementation - Collapse Date RangesOracle 数据库时态查询实现 - 折叠日期范围
【发布时间】:2013-11-08 23:31:51
【问题描述】:

这是我的一个查询的结果:

SURGERY_D
---------
01-APR-05
02-APR-05
03-APR-05
04-APR-05
05-APR-05
06-APR-05
07-APR-05

11-APR-05
12-APR-05
13-APR-05
14-APR-05
15-APR-05
16-APR-05

19-APR-05
20-APR-05
21-APR-05
22-APR-05
23-APR-05
24-APR-05

26-APR-05
27-APR-05
28-APR-05
29-APR-05
30-APR-05

我想将连续的日期范围折叠成间隔。例如,

[01-APR-05, 07-APR-05], [11-APR-05, 16-APR-05] and so on.

就时间数据库而言,我想“折叠”日期。知道如何在 Oracle 上做到这一点吗?我正在使用版本 11。我搜索它并阅读了一本书,但找不到/不明白如何去做。这可能很简单,但每个人都有自己的缺陷,而 Oracle 是我的。另外,我是新来的,所以如果我违反了任何规则,我深表歉意。谢谢!

【问题讨论】:

    标签: sql oracle plsql temporal-database


    【解决方案1】:

    您可以利用ROW_NUMBER 分析函数为每条记录生成一个唯一的连续编号(我们将按升序将该编号分配给日期)。

    然后,您按日期和生成的数字之间的差异对日期进行分组 - 连续日期将具有相同的差异:

    日期编号差异
    01-APR-05 1 1 -- MIN(date_val) 在组中,有差异。 = 1
    02-APR-05 2 1
    03-APR-05 3 1
    04-APR-05 4 1
    05-APR-05 5 1
    06-APR-05 6 1
    07-APR-05 7 1 -- 组中的 MAX(date_val) 有差异。 = 1
    11-APR-05 8 3 -- MIN(date_val) 组中的差异。 = 3
    12-APR-05 9 3
    13-APR-05 10 3
    14-APR-05 11 3
    15-APR-05 12 3
    16-APR-05 13 3 -- MAX(date_val) 在组中,有差异。 = 3

    最后,您选择每个组中的最小和最大日期来获取每个范围的开始和结束。

    这是查询:

    SELECT
        MIN(date_val) start_date,
        MAX(date_val) end_date
      FROM (
        SELECT
            date_val,
            row_number() OVER (ORDER BY date_val) AS rn
          FROM date_tab
      )
    GROUP BY date_val - rn
    ORDER BY 1
    ;
    

    输出:

    START_DATE END_DATE
    ------------ ----------
    01-04-2005 07-04-2005
    11-04-2005 16-04-2005
    2005 年 4 月 19 日 2005 年 4 月 24 日
    26-04-2005 30-04-2005

    您可以在 SQLFidlle 上查看它是如何工作的:Dates ranges example

    【讨论】:

    • 真的很聪明,兄弟!非常感谢 :)
    • 试过了,效果很好!非常感谢。这是我项目实施的最后一部分,我无法做到。已经尝试了2天了,哈哈。我希望能得到好分数,谢谢你!爱如此 \m/
    猜你喜欢
    • 2015-12-18
    • 2014-06-09
    • 2010-10-16
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多