日期:2014-05-17  浏览次数:20684 次

面试时的一个sql问题
要求只用一个句sql 查出表中某个字段值出现3次以上的,只显示其中三行数据,少于3次的是多少条就显示多少。

表中数据
col1 text1
11 第一科
12 第一科
21 第二科
31 第三科
32 第三科
33 第三科
34 第三科
12 第二科
35 第三科
结果为
col1 text1  
21 第二
12 第二
31 第三
32 第三
33 第三
11 第一 1
12 第一

请问如果写呢?

------解决方案--------------------
SQL code
SELECT col1,text1
  FROM (SELECT t.*, row_number() over(PARTITION BY text1 ORDER BY col1) rn FROM t)
 WHERE rn <= 3

------解决方案--------------------
select * from tab
group by text1
having count(text1)<=3
union 
select * from tab
group by text1
having count(text1)>3
where rownum<=3
------解决方案--------------------
探讨
SQL code
SELECT col1,text1
FROM (SELECT t.*, row_number() over(PARTITION BY text1 ORDER BY col1) rn FROM t)
WHERE rn <= 3

------解决方案--------------------
--分析函数最好
SQL code


select col1,text1
from (select col1,text1,row_number() over(partition by text1 order by col1) rn
from tb) a
where rn<=3

------解决方案--------------------
Ding
------解决方案--------------------
引用:
SQL code
SELECT col1,text1
FROM (SELECT t.*, row_number() over(PARTITION BY text1 ORDER BY col1) rn FROM t)
WHERE rn <= 3
------解决方案--------------------

select * from 
(
select col1,text1,row_number()over(partition by text1 order by col1) as num from tb
)
where num<=3
------解决方案--------------------
SQL code
select *
  from TABNAME t
 where (select count(1)
          from TABNAME
         where text1 = t.text1
           and col1 < t.col1
           and rownum <= 3) < 3