17,377
社区成员
发帖
与我相关
我的任务
分享
with tab1 as(
select 'parta' pn, 'card' st, 1 ord from dual union all
select 'parta' pn, 'filler' structure, 2 ord from dual union all
select 'parta' pn, 'filler' structure, 3 ord from dual union all
select 'parta' pn, 'card' structure, 4 ord from dual union all
select 'parta' pn, 'filler' structure, 5 ord from dual union all
select 'parta' pn, 'filler' structure, 6 ord from dual union all
select 'parta' pn, 'card' structure, 7 ord from dual union all
select 'partb' pn, 'card' structure, 1 ord from dual union all
select 'partb' pn, 'filler' structure, 2 ord from dual union all
select 'partb' pn, 'card' structure, 3 ord from dual
)
,tab2 as (
select lead(t1.st) over(partition by t1.pn order by t1.ord) le,
lag(t1.st) over(partition by t1.pn order by t1.ord) lg,
t1.pn,
t1.st
from tab1 t1
)
select distinct t1.pn
from tab2 t1
where t1.st = 'filler'
and t1.st != nvl(t1.le, '1')
and t1.st != nvl(t1.lg, '1')
;
[/quote]
修改如下:
with tab1 as(
select 'parta' pn, 'card' st, 1 ord from dual union all
select 'parta' pn, 'filler' structure, 2 ord from dual union all
select 'parta' pn, 'filler' structure, 3 ord from dual union all
select 'parta' pn, 'card' structure, 4 ord from dual union all
select 'parta' pn, 'filler' structure, 5 ord from dual union all
select 'parta' pn, 'filler' structure, 6 ord from dual union all
select 'parta' pn, 'card' structure, 7 ord from dual union all
select 'partb' pn, 'card' structure, 1 ord from dual union all
select 'partb' pn, 'filler' structure, 2 ord from dual union all
select 'partb' pn, 'card' structure, 3 ord from dual
),
tb11 as(
select t.*,rownum rm from tab1
)
,tab2 as (
select
t1.pn,
lead(t1.st) over( order by t1.rm) le,
lag(t1.st) over( order by t1.rm) lg,
t1.st,
t1.ord
from tb11 t1
)
select *
from tab2 t1
where t1.st = 'filler'
and t1.st != nvl(t1.le, '1')
and t1.st != nvl(t1.lg, '1')
;
[/quote]
这种rownum的用法,真实掩耳盗铃。而且关键的partition还让你给删了。数据稍微改一下你就查不出来了。
with tab1 as(
select 'parta' pn, 'filler' st, 1 ord from dual union all
select 'parta' pn, 'filler' structure, 2 ord from dual union all
select 'partb' pn, 'filler' structure, 2 ord from dual union all
select 'parta' pn, 'filler' structure, 3 ord from dual union all
select 'parta' pn, 'filler' structure, 4 ord from dual union all
select 'parta' pn, 'filler' structure, 5 ord from dual union all
select 'parta' pn, 'filler' structure, 6 ord from dual union all
select 'parta' pn, 'filler' structure, 7 ord from dual union all
select 'partb' pn, 'card' structure, 1 ord from dual union all
select 'partb' pn, 'card' structure, 3 ord from dual
),
tb11 as(
select t.*,rownum rm from tab1 t
)
,tab2 as (
select
t1.pn,
lead(t1.st) over( order by t1.rm) le,
lag(t1.st) over( order by t1.rm) lg,
t1.st,
t1.ord
from tb11 t1
)
select *
from tab2 t1
where t1.st = 'filler'
and t1.st != nvl(t1.le, '1')
and t1.st != nvl(t1.lg, '1')
;
with tab1 as(
select 'parta' pn, 'card' st, 1 ord from dual union all
select 'parta' pn, 'filler' structure, 2 ord from dual union all
select 'parta' pn, 'filler' structure, 3 ord from dual union all
select 'parta' pn, 'card' structure, 4 ord from dual union all
select 'parta' pn, 'filler' structure, 5 ord from dual union all
select 'parta' pn, 'filler' structure, 6 ord from dual union all
select 'parta' pn, 'card' structure, 7 ord from dual union all
select 'partb' pn, 'card' structure, 1 ord from dual union all
select 'partb' pn, 'filler' structure, 2 ord from dual union all
select 'partb' pn, 'card' structure, 3 ord from dual
)
,tab2 as (
select lead(t1.st) over(partition by t1.pn order by t1.ord) le,
lag(t1.st) over(partition by t1.pn order by t1.ord) lg,
t1.pn,
t1.st
from tab1 t1
)
select distinct t1.pn
from tab2 t1
where t1.st = 'filler'
and t1.st != nvl(t1.le, '1')
and t1.st != nvl(t1.lg, '1')
;
[/quote]with tab1 as(
select 'parta' pn, 'card' st, 1 ord from dual union all
select 'parta' pn, 'filler' structure, 2 ord from dual union all
select 'parta' pn, 'filler' structure, 3 ord from dual union all
select 'parta' pn, 'card' structure, 4 ord from dual union all
select 'parta' pn, 'filler' structure, 5 ord from dual union all
select 'parta' pn, 'filler' structure, 6 ord from dual union all
select 'parta' pn, 'card' structure, 7 ord from dual union all
select 'partb' pn, 'card' structure, 1 ord from dual union all
select 'partb' pn, 'filler' structure, 2 ord from dual union all
select 'partb' pn, 'card' structure, 3 ord from dual
),
tb11 as(
select t.*,rownum rm from tab1
)
,tab2 as (
select
t1.pn,
lead(t1.st) over( order by t1.rm) le,
lag(t1.st) over( order by t1.rm) lg,
t1.st,
t1.ord
from tb11 t1
)
select *
from tab2 t1
where t1.st = 'filler'
and t1.st != nvl(t1.le, '1')
and t1.st != nvl(t1.lg, '1')
;
我改了一下,主要思想还是这位大哥的,麻烦各位看看对不对
WITH TAB1 AS (
SELECT 'PARTA' PN, 'CARD' STRUCTURE, 1 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 2 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 3 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'CARD' STRUCTURE, 4 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 5 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 6 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'CARD' STRUCTURE, 7 ORD FROM DUAL UNION ALL
SELECT 'PARTB' PN, 'CARD' STRUCTURE, 1 ORD FROM DUAL UNION ALL
SELECT 'PARTB' PN, 'FILLER' STRUCTURE, 2 ORD FROM DUAL UNION ALL
SELECT 'PARTB' PN, 'CARD' STRUCTURE, 3 ORD FROM DUAL
)
, TAB2 AS (
SELECT DECODE(T1.STRUCTURE, 'CARD', 1,
DECODE(LEAD(T1.STRUCTURE) OVER(PARTITION BY T1.PN ORDER BY ORD), LAG(T1.STRUCTURE) OVER(PARTITION BY T1.PN ORDER BY ORD), 0, 1)
) AAA,
PN,STRUCTURE,ORD
FROM TAB1 T1
)
SELECT PN,STRUCTURE,ORD FROM TAB2 T1
WHERE AAA=0[/quote]
我都说我写错了...
decode会自动对null做判断,会导致这样的语句也能得到结果
with tab1 as (
select 'partb' pn, 'filler' structure, 2 ord from dual
)
, tab2 as (
select decode(t1.structure, 'card', 1,
decode(lead(t1.structure) over(partition by t1.pn order by ord), lag(t1.structure) over(partition by t1.pn order by ord), 0, 1)
) aaa,
pn,structure,ord
from tab1 t1
)
select pn,structure,ord from tab2 t1
where aaa=0
应该把decode换成case when。
根据我6楼提出的那种情况的处理方式,最终语句可能还要做修改。[/quote]
完全看不懂,更别说怎么改了
我改了一下,主要思想还是这位大哥的,麻烦各位看看对不对
WITH TAB1 AS (
SELECT 'PARTA' PN, 'CARD' STRUCTURE, 1 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 2 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 3 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'CARD' STRUCTURE, 4 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 5 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 6 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'CARD' STRUCTURE, 7 ORD FROM DUAL UNION ALL
SELECT 'PARTB' PN, 'CARD' STRUCTURE, 1 ORD FROM DUAL UNION ALL
SELECT 'PARTB' PN, 'FILLER' STRUCTURE, 2 ORD FROM DUAL UNION ALL
SELECT 'PARTB' PN, 'CARD' STRUCTURE, 3 ORD FROM DUAL
)
, TAB2 AS (
SELECT DECODE(T1.STRUCTURE, 'CARD', 1,
DECODE(LEAD(T1.STRUCTURE) OVER(PARTITION BY T1.PN ORDER BY ORD), LAG(T1.STRUCTURE) OVER(PARTITION BY T1.PN ORDER BY ORD), 0, 1)
) AAA,
PN,STRUCTURE,ORD
FROM TAB1 T1
)
SELECT PN,STRUCTURE,ORD FROM TAB2 T1
WHERE AAA=0[/quote]
我都说我写错了...
decode会自动对null做判断,会导致这样的语句也能得到结果
with tab1 as (
select 'partb' pn, 'filler' structure, 2 ord from dual
)
, tab2 as (
select decode(t1.structure, 'card', 1,
decode(lead(t1.structure) over(partition by t1.pn order by ord), lag(t1.structure) over(partition by t1.pn order by ord), 0, 1)
) aaa,
pn,structure,ord
from tab1 t1
)
select pn,structure,ord from tab2 t1
where aaa=0
应该把decode换成case when。
根据我6楼提出的那种情况的处理方式,最终语句可能还要做修改。
我改了一下,主要思想还是这位大哥的,麻烦各位看看对不对
WITH TAB1 AS (
SELECT 'PARTA' PN, 'CARD' STRUCTURE, 1 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 2 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 3 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'CARD' STRUCTURE, 4 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 5 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'FILLER' STRUCTURE, 6 ORD FROM DUAL UNION ALL
SELECT 'PARTA' PN, 'CARD' STRUCTURE, 7 ORD FROM DUAL UNION ALL
SELECT 'PARTB' PN, 'CARD' STRUCTURE, 1 ORD FROM DUAL UNION ALL
SELECT 'PARTB' PN, 'FILLER' STRUCTURE, 2 ORD FROM DUAL UNION ALL
SELECT 'PARTB' PN, 'CARD' STRUCTURE, 3 ORD FROM DUAL
)
, TAB2 AS (
SELECT DECODE(T1.STRUCTURE, 'CARD', 1,
DECODE(LEAD(T1.STRUCTURE) OVER(PARTITION BY T1.PN ORDER BY ORD), LAG(T1.STRUCTURE) OVER(PARTITION BY T1.PN ORDER BY ORD), 0, 1)
) AAA,
PN,STRUCTURE,ORD
FROM TAB1 T1
)
SELECT PN,STRUCTURE,ORD FROM TAB2 T1
WHERE AAA=0select 'a' pn, 'card' st, 1 ord from dual union all
select 'a' pn, 'filter' st, 2 ord from dual union all
select 'a' pn, 'card' st, 3 ord from dual union all
select 'a' pn, 'filter' st, 4 ord from dual union all
select 'a' pn, 'filter' st, 5 ord from dual union all
select 'a' pn, 'card' st, 6 ord from dual
with tab1 as (
select 'a' pn, 'f' st, 1 ord from dual union all
select 'a' pn, 'a' st, 2 ord from dual union all
select 'a' pn, 'a' st, 3 ord from dual union all
select 'a' pn, 'f' st, 4 ord from dual union all
select 'b' pn, 'f' st, 1 ord from dual union all
select 'b' pn, 'a' st, 2 ord from dual union all
select 'b' pn, 'f' st, 3 ord from dual
)
, tab2 as (
select decode(t1.st, 'f', 1,
decode(lead(t1.st) over(partition by t1.pn order by ord), lag(t1.st) over(partition by t1.pn order by ord), 0, 1)
) aaa,
t1.pn, t1.st
from tab1 t1
)
select t1.pn from tab2 t1
where t1.st = 'a'
group by t1.pn
having sum(aaa) = 0
;
card
filter
card
filter
filter
card
这种算不算?with tab1 as(
select 'parta' pn, 'card' st, 1 ord from dual union all
select 'parta' pn, 'filler' structure, 2 ord from dual union all
select 'parta' pn, 'filler' structure, 3 ord from dual union all
select 'parta' pn, 'card' structure, 4 ord from dual union all
select 'parta' pn, 'filler' structure, 5 ord from dual union all
select 'parta' pn, 'filler' structure, 6 ord from dual union all
select 'parta' pn, 'card' structure, 7 ord from dual union all
select 'partb' pn, 'card' structure, 1 ord from dual union all
select 'partb' pn, 'filler' structure, 2 ord from dual union all
select 'partb' pn, 'card' structure, 3 ord from dual
)
,tab2 as (
select lead(t1.st) over(partition by t1.pn order by t1.ord) le,
lag(t1.st) over(partition by t1.pn order by t1.ord) lg,
t1.pn,
t1.st
from tab1 t1
)
select distinct t1.pn
from tab2 t1
where t1.st = 'filler'
and t1.st != nvl(t1.le, '1')
and t1.st != nvl(t1.lg, '1')
;