仅选择一个序列
Selecting only a sequence
我想 select 在我的 table 中只有一部分在我阅读 00006 并在我阅读下一个模式 00XXX 时停止 selecting 。(这里是 00040 但它是可能是另一个数字 )
00006
123456
456789
123789
00040
125478
547896
454623
519846
00001
....
这里,例如,我只想获得这些带有 select 的值:
123456
456789
123789
如何获得?我没有找到任何线索。
感谢您的帮助。
ps:我无权转换我 select
的 table
有了查尔斯的解决方案:
with marker as (
select rownumber() over() as rowno
, rrn(t) as recno, cast(substr(YYYYYY, 1, 5)as integer) as markvalue
from fap1t010.£$ZZZZZZ t
where substr(YYYYYY, 1, 5) like ('00___')
), dataa as (
select rrn(t) as recno, cast(substr(YYYYYY, 1, 6)as integer) as datavalue
from fap1t010.£$ZZZZZZ t
where substr(YYYYYY, 1, 5) NOT like ('00006')
and substr(YYYYYY, 13, 1) ='C'
), ranges as(
select a.markvalue
, a.recno as startrec
, b.recno as endrec
from marker A join marker B
on b.rowno = a.rowno +1
)
select distinct d.datavalue
from ranges R join dataa D
on d.recno between r.startrec and r.endrec
where r.markvalue = 00006
哇...这是一个丑陋的要求。
但可以做到:
with marker as (
select rownumber() over() as rowno
, rrn(t) as recno, myfld as markvalue
from dtcwilt.temp t
where myfld like ('00___ ')
), data as (
select rrn(t) as recno, myfld as datavalue
from dtcwilt.temp t
where myfld NOT like ('00___ ')
), ranges as(
select a.markvalue
, a.recno as startrec
, b.recno as endrec
from marker A join marker B
on b.rowno = a.rowno +1
)
select d.datavalue
from ranges R join data D
on d.recno between r.startrec and r.endrec
where r.markvalue = '00006';
如果你有一个大数据集,性能就不会那么好;可能还有改进的余地。不过以上至少是通俗易懂的。
如果您碰巧使用的是最新版本的 IBM i 7.3,您可能可以通过使用新的 LEAD()
and/or LAG()
函数来简化语句。但是我没有 7.3 可以测试。
我想 select 在我的 table 中只有一部分在我阅读 00006 并在我阅读下一个模式 00XXX 时停止 selecting 。(这里是 00040 但它是可能是另一个数字 )
00006
123456
456789
123789
00040
125478
547896
454623
519846
00001
....
这里,例如,我只想获得这些带有 select 的值:
123456 456789 123789
如何获得?我没有找到任何线索。
感谢您的帮助。
ps:我无权转换我 select
的 table有了查尔斯的解决方案:
with marker as (
select rownumber() over() as rowno
, rrn(t) as recno, cast(substr(YYYYYY, 1, 5)as integer) as markvalue
from fap1t010.£$ZZZZZZ t
where substr(YYYYYY, 1, 5) like ('00___')
), dataa as (
select rrn(t) as recno, cast(substr(YYYYYY, 1, 6)as integer) as datavalue
from fap1t010.£$ZZZZZZ t
where substr(YYYYYY, 1, 5) NOT like ('00006')
and substr(YYYYYY, 13, 1) ='C'
), ranges as(
select a.markvalue
, a.recno as startrec
, b.recno as endrec
from marker A join marker B
on b.rowno = a.rowno +1
)
select distinct d.datavalue
from ranges R join dataa D
on d.recno between r.startrec and r.endrec
where r.markvalue = 00006
哇...这是一个丑陋的要求。
但可以做到:
with marker as (
select rownumber() over() as rowno
, rrn(t) as recno, myfld as markvalue
from dtcwilt.temp t
where myfld like ('00___ ')
), data as (
select rrn(t) as recno, myfld as datavalue
from dtcwilt.temp t
where myfld NOT like ('00___ ')
), ranges as(
select a.markvalue
, a.recno as startrec
, b.recno as endrec
from marker A join marker B
on b.rowno = a.rowno +1
)
select d.datavalue
from ranges R join data D
on d.recno between r.startrec and r.endrec
where r.markvalue = '00006';
如果你有一个大数据集,性能就不会那么好;可能还有改进的余地。不过以上至少是通俗易懂的。
如果您碰巧使用的是最新版本的 IBM i 7.3,您可能可以通过使用新的 LEAD()
and/or LAG()
函数来简化语句。但是我没有 7.3 可以测试。