更难的SQL题目!!!
上一篇 / 下一篇 2007-06-14 00:00:00 / 个人分类:oracle
更难的SQL题目!!! ITPUB个人空间/L(Z#ac[Je1k
Q:再考一道SQL面试难题,因为是英文翻译过来的,不知道大家能不能理解我的意思
7u/kkz"I*CDX0再问大家一道SQL面试题
表a
字段ITPUB个人空间E]q#P"|kT%b/f/p
a1,a2,a3,a4,a5,a6,a7,a8
ITPUB个人空间R WkZ%xuY2r
请统计出每两列重复,三列重复,四列重复,五列重复,6列重复,7列重复记录的值
统计结果如下
重复2列的 XXXITPUB个人空间ZLu:PQ
T?
重复3列的 XXXITPUB个人空间N/xI c't
重复4列的 XXXITPUB个人空间G AJVo#W
重复5列的 XXX
1imDS-k%QXv0重复6列的 XXXITPUB个人空间.`?ng Jv
重复7列的 XXX
比如记录中如果出现 a1=a2 有两行那就表示两列重复的值为2
但是如果是三列之间相等那要算3列的,和两列之间无关了,前面说的两列相等要仅仅两列相等
&b9@uF"M/ZB:aS7p0后面的不管说多少列都要说仅仅.就是仅仅两列相等的,仅仅三列相等的。如果四列相等就不能算到三列相等中去
#AKO/FE3PFN0请做出这个统计,不知道大意大家明白没,我当时看题目是英文的,大意是这样的,请大家看看,是否有点难解
比如
!M&JKmPVO)A0一行数据为:1, 1, 2, 2, 3, 3, 4, 4ITPUB个人空间 K oH2S7i#J BrU3K
该如何统计ITPUB个人空间5\;ylgtE
虽然重复多个,但是算一行,就是两个重复的
ITPUB个人空间8J RVK9@Q/z
1, 1, 2, 2, 3, 3, 4, 4 算两个重复的一列ITPUB个人空间`Ji:lgIse
1, 1, 2, 5, 6, 3, 4, 9算两个重复的一列
'RC
nG,~c01, 1, 1, 3, 5, 7 ,2 ,6 算三个重复的一列ITPUB个人空间w
W s$p#Z9G9E
1, 1, 1 , 3, 3 ,3 8 ,8 算三个重复的一列
就是说任何字段间记录出现两个相同的就算去统计(3列同就跑到三列的那个范围去了,就不在这里了。两个只相同出现多次不要紧)
就算重复2列的 XXX
就是说任何字段间记录出现三个相同的就算去统计(4列同就跑到4列的那个范围去了,就不在这里了。4个只相同出现多次不要紧,呵呵,不过如果是5个出现相同就不可能出现两对了,因为就8个字段)
就算重复3列的 XXX
["Y
M}\9K5rv5c0A:ITPUB个人空间lv\X&C
I〉针对一般情况的情况的处理
8b|Mk4D B!@0方法一:with tt as (ITPUB个人空间Vm8uI&^p
select 1 no1, 1 no2, 2 no3, 2 no4, 3 no5, 3 no6, 4 no7 , 4 no8 from dualITPUB个人空间'C-}xid9y
)ITPUB个人空间$m
U(W5Pz7q0rK
select max(count(0)) from(ITPUB个人空间Ez5^KI%xWII
select decode(rn,1,no1,2,no2,3,no3,4,no4,5,no5,6,no6,7,no7,8,no8)col from(
/C IIwQIL4D+?.E0select tt.*,a.rn from tt,(select rownum rn from dual connect by rownum<9) a ITPUB个人空间[8B([!^S
)) group by colITPUB个人空间0~z byP
方法二:ITPUB个人空间{ u8w?8]
create table test(a number,b number,c number,d number,e number,f number,g number,h number);ITPUB个人空间 d0ruig
insert into test values(1, 1, 2, 2, 3, 3, 4, 4 );
RKA#JD0insert into test values(1, 1, 2, 5, 6, 3, 4, 9 );
}C}(hZ#Y3]`D&_0insert into test values(1, 1, 1, 3, 5, 7, 2, 6 );ITPUB个人空间%OooN:Uh4C)M
insert into test values(1, 1, 1, 3, 3, 3, 8, 8 );
ITPUB个人空间^j z)A'tu9N
create or replace type t_object as object(
%MK |
l)f8F0I1v,P0id varchar2(60),ITPUB个人空间|?-Y6\
yN
sub_id varchar2(60));
H1u@u$g c3w8C0/
create type t_ret_table is table of t_object;
3n#Sf5vT
o9Zf:Y4_"Z0/
create or replace function f_test(var_str in varchar2) return t_ret_table PIPELINEDITPUB个人空间Y(\2~~#XL7p'h3}:Y)F
as
xwJ#Q'q3P[0var_tmp varchar2(60);
N3K*b
?rw0|0var_element varchar2(60);ITPUB个人空间{&JnDs`
begin
vLm$r8s.H%Y0for i in (select a||'@@'||b||'@@'||c||'@@'||d||'@@'||e||'@@'||f||'@@'||g||'@@'||h id from test) loopITPUB个人空间/L0@,W
y9~/CG
var_tmp := i.id;ITPUB个人空间;F6lh/s+A
while instr(var_tmp,'@@')>0 loop
%iF~V8tjr)b1r0var_element := substr(var_tmp,1,instr(i.id,'@@')-1);ITPUB个人空间w0lzdO2DBS`/m4v
var_tmp := substr(var_tmp,instr(i.id,'@@')+2,length(var_tmp));
,iz;ZF6W3|\9p0pipe row(t_object(i.id,var_element));
k&Z9vNX&|M:c0end loop;
Y;Cm)|gZ0pipe row(t_object(i.id,var_tmp));
1_j"Y2v^ U{0end loop;ITPUB个人空间1is;tW@/]
return;
?8K(]#wmW)[!FT0end f_test;ITPUB个人空间
Q8jUL)I]$x
/
SQL> select replace(id,'@@') id,max(sl) from (select id,sub_id,count(*) sl from (select * from table(f_test('a'))) group by id,sub_id) group by id;
ID MAX(SL)ITPUB个人空间|,ULA4v+T9MZ+U:B
------------------------------------------------------------ ----------
E _]1R4b"v5n
M4AY011133388 3
ZZ aM2H8PE011135726 3
fgWG DOH{
t011223344 2
fU8]wEdgr/TY011256349 2
II〉针对连续列相同才计算的情况的处理
分两种情况
1A1G Q"\R)y01.每一列的长度为1,也就是单字符char(1)的ITPUB个人空间1A
VmK!B\)i6S?
2.每一列得长度不定,也就是varchar2
测试用表;ITPUB个人空间"l)ba;dq},xn
create table uss ITPUB个人空间S,bJa-P
(
7cqX;nc~ r0a1 varchar2(10),ITPUB个人空间_lD tx"{+cBdR
a2 varchar2(10),
TrAve%]2cw0a3 varchar2(10),
5L4R7oE$UeA d0a4 varchar2(10),ITPUB个人空间!]"U {a&S
a5 varchar2(10),
7qB^:zil(_'l0a6 varchar2(10),ITPUB个人空间&qX,u[ \u E}
a7 varchar2(10),ITPUB个人空间0Y~c.r5LsK'Y
a8 varchar2(10)
!aB?&K n!d\0)
:`-H ibpC ?0nologging;ITPUB个人空间'M.l/c
|oY
一:对于1ITPUB个人空间;yErP5w?`
A:插入测试数据:ITPUB个人空间
{`7` c]ucf*E-{
insert into uss values('1','1','1','1','2','2','3','4');
i']/\tFE M5J'Co0insert into uss values('1','1','3','3','2','2','3','4');ITPUB个人空间Zn#|r|o2bV-m
insert into uss values('1','1','3','3','2','2','3','4');ITPUB个人空间"Q[s9ITE
insert into uss values('1','1','1','1','2','2','3','4');ITPUB个人空间c"G Z$@$k
insert into uss values('1','1','1','1','2','2','3','4');
g8X Uz'yF0insert into uss values('1','1','6','1','2','1','3','4');ITPUB个人空间p'r4ICv%\d/M1S i
insert into uss values('1','1','1','6','2','1','3','4');ITPUB个人空间9r$["]ucoF:e
commit;ITPUB个人空间8U["^{ XvQ4q
B:建立函数
?e
^8{A?
j9K0create or replace function foundoutchar1(str in varchar2) return varchar2 asITPUB个人空间x1j2M2P,h2e
instr number := 0;
VP/f%h}`4}.i:U0 instr1 number := 0;
A'Ks
_5D-h[S7zp0beginITPUB个人空间/t&~/ZAn
for i in 2 .. length(str)
G\bl;z,\8b}0 loopITPUB个人空间1L)Lc[W{d{%J+W
if (substr(str,i,1) = substr(str, i - 1, 1)) then
G4_O:E,tM0 instr := instr + 1;ITPUB个人空间c.fP6|&r9{"Q
if (i = length(str) and instr > instr1) then
,\:X/qE$T4}} t l&E0 instr1 := instr;
3{Ig0p#L6g9i0 end if;
9Tk1Am5__Y'zu0 elseITPUB个人空间e g![7z u3p
if (instr > instr1) thenITPUB个人空间3~5H1l9L9j2G,y
instr1 := instr;
Bsji_:z0 end if;
nt.J+f+Uw"zE0 instr := 0;ITPUB个人空间0B/r6]+lU'B)l-I\T(t
end if;ITPUB个人空间@'@m ZTs
l
end loop;ITPUB个人空间O5N:Y7C
r Om m
return '重复' || (instr1+1) || '列的';ITPUB个人空间0b/hdA"_
{*Im
end;ITPUB个人空间1pZ,X(Hs+F9]
C:运行的sql:ITPUB个人空间b+}x*YW v"C(Di
select count(foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8)) aa,ITPUB个人空间4hS/s
Wx)wJ9}
foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8) aa1
A~[Mb_/v0from uss t
1Yz+u-\;`t D7N0group by foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8);
X8j8CO"P~T ]Snwt0D:执行结果
M)Emf$bl0SQL> set serveroutput on
K"QM-U c;fe%[*H0SQL>
x:G2c([+J%_0SQL> select count(foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8)) aa,ITPUB个人空间"Rd'e7c!S y IbT
P
2 foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8) aa1
2u9Okg8ge0 3 from uss tITPUB个人空间'E2`u9@K
4 group by foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8)ITPUB个人空间b ?_j7ao1x*H8S
5 ;
AA AA1ITPUB个人空间Y)k8U\y.K7UR?*L)v:H
---------- --------------------------------------------------------------------------------ITPUB个人空间%y0o} P?IbI4d
p\
1 重复3列的
k$cD Dn F W5b0 3 重复4列的
7E\Dw@{x;z0 3 重复2列的
evH O"k
ld.h!V0二:对于2
$Rp6a%\qr8l0A:插入测试数据:ITPUB个人空间4W0l1j{Op
E6wR$Zo
truncate table uss;
insert into uss values('11','11','11','11','22','22','33','44');ITPUB个人空间:T,NO7VFF`
insert into uss values('11','11','33','33','22','22','33','44');ITPUB个人空间9e k"b:p;IQ6`I
insert into uss values('11','11','33','33','22','22','33','44');
;U8Xqv
L
AYdD0insert into uss values('11','11','11','11','22','22','33','44');
'}4pX4v](K dh0insert into uss values('11','11','11','11','22','22','33','44');ITPUB个人空间B2tp
z z`o(r-~b
insert into uss values('11','11','66','11','22','11','33','44');