模式条款(10克+)可在非常紧凑的方式做到这一点:
SQL> create table observation(ObservationID , Region ,obs_date, Status)
2 as
3 select 1, 10, date '2012-03-01', 'Ice' from dual union all
4 select 2, 10, date '2012-04-01', 'Water' from dual union all
5 select 3, 10, date '2012-05-01', 'Water' from dual union all
6 select 4, 10, date '2012-06-01', 'Gas' from dual union all
7 select 5, 10, date '2012-07-01', 'Ice' from dual union all
8 select 6, 20, date '2012-06-02', 'Water' from dual union all
9 select 7, 20, date '2012-07-02', 'Water' from dual union all
10 select 8, 20, date '2012-08-02', 'Water' from dual union all
11 select 9, 20, date '2012-09-02', 'Water' from dual union all
12 select 10, 20, date '2012-10-02', 'Ice' from dual ;
Table created.
SQL> select ObservationID, obs_date, Status, status_change
2 from observation
3 model
4 dimension by (Region, obs_date, Status)
5 measures (ObservationID, obs_date obs_date2, cast(null as date) status_change)
6 rules (
7 status_change[any,any,any] = min(obs_date2)[cv(Region), obs_date > cv(obs_date), status != cv(status)]
8 )
9 order by 1;
OBSERVATIONID OBS_DATE STATU STATUS_CH
------------- --------- ----- ---------
1 01-MAR-12 Ice 01-APR-12
2 01-APR-12 Water 01-JUN-12
3 01-MAY-12 Water 01-JUN-12
4 01-JUN-12 Gas 01-JUL-12
5 01-JUL-12 Ice
6 02-JUN-12 Water 02-OCT-12
7 02-JUL-12 Water 02-OCT-12
8 02-AUG-12 Water 02-OCT-12
9 02-SEP-12 Water 02-OCT-12
10 02-OCT-12 Ice
小提琴:http://sqlfiddle.com/#!4/f6687/1
即我们将在区域,日期和状态维度,因为我们想看看在具有相同区域的单元格中,但获取状态不同的第一个日期。
我们也必须测量日期,所以我创建了一个别名obs_date2
来做到这一点,我们想要一个新的列status_change
来保存状态更改的日期。
此行是做生产线上的所有工作为我们:
status_change[any,any,any] = min(obs_date2)[cv(Region), obs_date > cv(obs_date), status != cv(status)]
它说,我们的三个维度,只能看着与同一区域(cv(Region),
)行和看行,其中该日期跟随当前行的日期(obs_date > cv(obs_date)
),并且状态不同于当前行(status != cv(status)
),最后获得满足此组条件的最小日期(min(obs_date2)
)并将其分配给status_change
。左边的any,any,any
部分表示此计算适用于所有行。
至于代码,我需要它给我的每一个特定状态的开始和结束日期为每个区域,即多长时间做最后在区域A冻结?我已经尝试了子查询,这些子查询为每个状态提供了最早的日期,但无法正确地将它们与正确的状态更改进行配对。类似于LEAD的功能将是理想的,但比下一个记录更具有延伸性。 – David 2013-03-26 21:53:12
冰/水/气是不是真实的数据,我的问题只是代表......真正的查询是漫长的,肯定会浪费你的时间。很简单,选择四列来自四个不同的表格,其中“更改日期”是我无法创建的列。如果这还不够,更多道歉,这是新的,不想浪费你的时间。 – David 2013-03-26 22:00:11
@大卫:很多SQL问题在这里倾向于使用SQL小提琴,以显示你的架构设置,到目前为止,你已经尝试过的东西;这里有一个开始的地方:http://sqlfiddle.com/#!4/7e66a/2你可以添加一个样本查询你到目前为止已经尝试过吗? – Alkini 2013-03-26 22:14:28