我怎样才能有效地查询连续集的日期在我的数据集?

site_id | start_date | end_date 1 | oct 1, 08 | oct 2, 08 1 | oct 2, 08 | oct 3, 08 ... 1 | oct 30, 08 | oct 31, 08 2 | oct 1, 08 | oct 2, 08 2 | oct 2, 08 | oct 3, 08 ... 2 | oct 30, 08 | oct 31, 08

我有一个包含每个站点每一个月(每月年度)的第1天的记录表。 我需要能够确定是否一个站点为给定月份具有至少15个连续的记录,并且我需要知道一系列连续天的开始和结束日期。 我可以在存储过程中做到这一点,但我希望这可以在单个查询来实现。 我处理的一个相当大的数据集,至少有30万条记录,每月。

示例结果:

site_id | contiguous_start_date | contiguous_end_date 1 | oct 5, 2008 | oct 20, 2008 2 | oct 10 | oct 30, 2008 3 | oct 1 | oct 31, 2008

感谢你的帮助!

--------------解决方案-------------

这里是如何做到这样的查询的例子:

SQL> create table t (site_id,start_date,end_date)
2 as
3 select 1, date '2008-10-01', date '2008-10-02' from dual union all
4 select 1, date '2008-10-02', date '2008-10-03' from dual union all
5 select 1, date '2008-10-03', date '2008-10-30' from dual union all
6 select 1, date '2008-10-30', date '2008-10-31' from dual union all
7 select 2, date '2008-10-01', date '2008-10-02' from dual union all
8 select 2, date '2008-10-02', date '2008-10-03' from dual union all
9 select 2, date '2008-10-03', date '2008-10-04' from dual union all
10 select 2, date '2008-10-04', date '2008-10-05' from dual union all
11 select 2, date '2008-10-05', date '2008-10-06' from dual union all
12 select 2, date '2008-10-06', date '2008-10-07' from dual union all
13 select 2, date '2008-10-07', date '2008-10-08' from dual union all
14 select 2, date '2008-10-08', date '2008-10-09' from dual union all
15 select 2, date '2008-10-09', date '2008-10-10' from dual union all
16 select 2, date '2008-10-10', date '2008-10-11' from dual union all
17 select 2, date '2008-10-11', date '2008-10-12' from dual union all
18 select 2, date '2008-10-12', date '2008-10-13' from dual union all
19 select 2, date '2008-10-13', date '2008-10-14' from dual union all
20 select 2, date '2008-10-14', date '2008-10-15' from dual union all
21 select 2, date '2008-10-15', date '2008-10-16' from dual union all
22 select 2, date '2008-10-16', date '2008-10-17' from dual union all
23 select 2, date '2008-10-17', date '2008-10-18' from dual union all
24 select 2, date '2008-10-18', date '2008-10-19' from dual union all
25 select 2, date '2008-10-19', date '2008-10-20' from dual union all
26 select 3, date '2008-10-01', date '2008-10-02' from dual union all
27 select 3, date '2008-10-02', date '2008-10-03' from dual union all
28 select 3, date '2008-10-03', date '2008-10-04' from dual union all
29 select 3, date '2008-10-04', date '2008-10-05' from dual union all
30 select 3, date '2008-10-05', date '2008-10-06' from dual union all
31 select 3, date '2008-10-06', date '2008-10-07' from dual union all
32 select 3, date '2008-10-07', date '2008-10-08' from dual union all
33 select 3, date '2008-10-08', date '2008-10-09' from dual union all
34 select 3, date '2008-10-09', date '2008-10-10' from dual union all
35 select 3, date '2008-10-30', date '2008-10-31' from dual
36 /

Tabel is aangemaakt.

然后查询:

SQL> select site_id
2 , min(start_date) contiguous_start_date
3 , max(end_date) contiguous_end_date
4 , count(*) number_of_contiguous_records
5 from ( select site_id
6 , start_date
7 , end_date
8 , max(rn) over (partition by site_id order by start_date) maxrn
9 from ( select site_id
10 , start_date
11 , end_date
12 , case lag(end_date) over (partition by site_id order by start_date)
13 when start_date then null
14 else rownum
15 end rn
16 from t
17 )
18 )
19 group by site_id
20 , maxrn
21 order by site_id
22 , contiguous_start_date
23 /

而结果:

SITE_ID CONTIGUOUS_START_DA CONTIGUOUS_END_DATE NUMBER_OF_CONTIGUOUS_RECORDS
---------- ------------------- ------------------- ----------------------------
1 01-10-2008 00:00:00 31-10-2008 00:00:00 4
2 01-10-2008 00:00:00 20-10-2008 00:00:00 19
3 01-10-2008 00:00:00 10-10-2008 00:00:00 9
3 30-10-2008 00:00:00 31-10-2008 00:00:00 1

4 rijen zijn geselecteerd.

问候,罗布。

这绝对是非常有可能的。 我几个月前解决SQL Server中的类似问题。 我什么都不知道甲骨文语法,所以我怕我不能,如果你转换,但如果你是固体,甲骨文,这应该是足以让你那里。

你的数据库结构不适合你的业务逻辑:

  • END_DATE总是START_DATE后第二天,为什么你必须将其存储在数据库中?
  • 我看到你给的数据样本中存在的日期,没有空间范围内一个单一的网站。 这意味着,不必存储所有日期期刚开始和结束日期。

每月3000万的记录实在是表,你必须编写查询。 做这个表的结构重构是我的意见。

分类:SQL 时间:2015-03-15 人气:1
本文关键词: SQL,甲骨文
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.539 (s). 10 q(s)