with
t1 as
(
select '100' as subs_id from dual
union all
select '101' as subs_id from dual
union all
select '102' as subs_id from dual
union all
select '103' as subs_id from dual
union all
select '104' as subs_id from dual
)
,
t2 as
(
select '100' as subs_id,'c01' as status,'1' as sqe from dual
union all
select '100' as subs_id,'c02' as status,'2' as sqe from dual
union all
select '100' as subs_id,'c02' as status,'3' as sqe from dual
union all
select '101' as subs_id,'c02' as status,'1' as sqe from dual
union all
select '101' as subs_id,'c01' as status,'1' as sqe from dual
union all
select '101' as subs_id,'c02' as status,'2' as sqe from dual
union all
select '102' as subs_id,'c02' as status,'1' as sqe from dual
union all
select '103' as subs_id,'c02' as status,'1' as sqe from dual
union all
select '104' as subs_id,'c02' as status,'1' as sqe from dual
)
select t1.subs_id,t2.status,t2.sqe from t1 left join t2 on t1.subs_id = t2.subs_id以上为数据.
sql要求:t1五条记录.
结果为五条记录,右表字段取值要求:
1.当有c01时,只取c01那一条
2.当有c01,c02时,只取c01那一条
3.当只有c02时,按sqe 取最小的那一条.结果为:
100 c01 1
101 c01 1
102 c02 1
103 c02 1
104 c02 1
求sql
t1 as
(
select '100' as subs_id from dual
union all
select '101' as subs_id from dual
union all
select '102' as subs_id from dual
union all
select '103' as subs_id from dual
union all
select '104' as subs_id from dual
)
,
t2 as
(
select '100' as subs_id,'c01' as status,'1' as sqe from dual
union all
select '100' as subs_id,'c02' as status,'2' as sqe from dual
union all
select '100' as subs_id,'c02' as status,'3' as sqe from dual
union all
select '101' as subs_id,'c02' as status,'1' as sqe from dual
union all
select '101' as subs_id,'c01' as status,'1' as sqe from dual
union all
select '101' as subs_id,'c02' as status,'2' as sqe from dual
union all
select '102' as subs_id,'c02' as status,'1' as sqe from dual
union all
select '103' as subs_id,'c02' as status,'1' as sqe from dual
union all
select '104' as subs_id,'c02' as status,'1' as sqe from dual
)
select t1.subs_id,t2.status,t2.sqe from t1 left join t2 on t1.subs_id = t2.subs_id以上为数据.
sql要求:t1五条记录.
结果为五条记录,右表字段取值要求:
1.当有c01时,只取c01那一条
2.当有c01,c02时,只取c01那一条
3.当只有c02时,按sqe 取最小的那一条.结果为:
100 c01 1
101 c01 1
102 c02 1
103 c02 1
104 c02 1
求sql
from t1 a,
(select * from (select t.*,row_number() over(partition by t.subs_id order by t.status,t.sqe) order_id
from t2 t) where order_id = 1) b
where a.subs_id = b.subs_id(+)
select subs_id,
status,
sqe,
case
when status2 = 'c01' then
1
when instr(status2, 'c01') > 0 and status = 'c01' then
1
when status2 = 'c02' then
row_number() over (partition by subs_id order by sqe asc)
when status not in ('c01','c02') then
1
else
0
end as qq from (
select tt.subs_id,
tt.status,
tt.sqe,
wm_concat(tt.status) over(partition by tt.subs_id) as status2
from (select t1.subs_id, t2.status, t2.sqe from t1 left join t2 on t1.subs_id = t2.subs_id) tt
)
)
where qq > 0
from table
我这样解决的,后来又连了一下表,条件是num = 1
dense_rank()和row_number()只是对于完全重复的数据有区别,对于你这题是一样的,甚至可以说row_number()更好,如果有2个c01,1的数据,dense_rank()会显示2个1,这样你就会得到2个c01的数据了row_number()会显示成1和2,你只会得到一条
with
t1 as
(
select '100' as subs_id from dual
union all
select '101' as subs_id from dual
union all
select '102' as subs_id from dual
union all
select '103' as subs_id from dual
union all
select '104' as subs_id from dual
)
,
t2 as
(
select '100' as subs_id,'c01' as status,'1' as sqe from dual
union all
select '100' as subs_id,'c02' as status,'2' as sqe from dual
union all
select '100' as subs_id,'c02' as status,'3' as sqe from dual
union all
select '101' as subs_id,'c02' as status,'1' as sqe from dual
union all
select '101' as subs_id,'c01' as status,'1' as sqe from dual
union all
select '101' as subs_id,'c02' as status,'2' as sqe from dual
union all
select '102' as subs_id,'c02' as status,'1' as sqe from dual
union all
select '103' as subs_id,'c02' as status,'1' as sqe from dual
union all
select '104' as subs_id,'c02' as status,'1' as sqe from dual
)
select subs_id,status,sqe from ( select t1.subs_id,t2.status,t2.sqe,row_number()over(partition by t1.subs_id order by t2.status,t2.sqe) rn from t1 left join t2 on t1.subs_id = t2.subs_id)
where rn=1
其实用row_number()是完全可以的, 我现在只是想确认一下 分析函数对性能的影响.会不会象distinct 那样,影响特别大.分析函数都进行了哪些操作?会进行全表扫描吗?
from t1
left join (select rank() over(partition by subs_id order by status, decode(status, 'c02', sqe, 1)) as rn,
t2.*
from t2) t2 on t1.subs_id = t2.subs_id
and t2.rn = 1