|
|
回复 #1 lastwinner 的帖子
3.1.1 题例
我有一个表结构,
fphm,kshm
2014,00000001
2014,00000002
2014,00000003
2014,00000004
2014,00000005
2014,00000007
2014,00000008
2014,00000009
2013,00000120
2013,00000121
2013,00000122
2013,00000124
2013,00000125
(第二个字段内可能是连续的数据,可能存在断点。)
怎样能查询出来这样的结果,查询出连续的记录来。
就像下面的这样?
2014,00000001,00000005
2014,00000009,00000007
2013,00000120,00000122
2013,00000124,00000125
3.1.2 解答
思路:利用lag取得前一行的kshm,然后和本行的kshm想比,如果差值为1,说明这一行和上一行是连续的。由于首尾的特殊性,故而需要先用max和min来获得首尾点。
PHP code:--------------------------------------------------------------------------------
select fphm, nvl(lag(e)over(partition by fphm order by s),minn) ST, nvl(S,maxn) EN from
(select fphm, lag(kshm,1) over(partition by fphm order by kshm) S, kshm E,
min(kshm)over(partition by fphm) minn, max(kshm) over(partition by fphm) maxn from t)
where nvl(E-S-1,1)<>0;
FPHM ST EN
---------- ---------- ----------
2013 00000120 00000122
2013 00000124 00000125
2014 00000001 00000005
2014 00000007 00000009
-------------------------
我的写法:
create table test_3 ( fphm varchar2(10),kshm varchar2(10));
insert into test_3 values ('2014','00000001');
insert into test_3 values ('2014','00000002');
insert into test_3 values ('2014','00000003');
insert into test_3 values ('2014','00000004');
insert into test_3 values ('2014','00000005');
insert into test_3 values ('2014','00000007');
insert into test_3 values ('2014','00000008');
insert into test_3 values ('2014','00000009');
insert into test_3 values ('2013','00000120');
insert into test_3 values ('2013','00000121');
insert into test_3 values ('2013','00000122');
insert into test_3 values ('2013','00000124');
insert into test_3 values ('2013','00000125');
commit;
---------
SELECT fphm,MIN(kshm) ,MAX(kshm) FROM test_3 GROUP BY fphm,kshm-ROWNUM; |
|