面试遇到的问题
2011-08-10 21:25
204 查看
一个表,两个字段,A、B,取出每个A类型的B由大到小排列的前两个。
create table test_a
(
a varchar2(10),
b int
)
truncate table test_a;
insert into test_a values ('a',10);
insert into test_a values ('a',1);
insert into test_a values ('a',2);
insert into test_a values ('a',3);
insert into test_a values ('a',4);
insert into test_a values ('a',5);
insert into test_a values ('a',6);
insert into test_a values ('b',12);
insert into test_a values ('b',14);
insert into test_a values ('b',1);
insert into test_a values ('b',6);
insert into test_a values ('c',2);
insert into test_a values ('c',4);
insert into test_a values ('c',4);
insert into test_a values ('c',5);
insert into test_a values ('c',3);
insert into test_a values ('c',15);
insert into test_a values ('d',1);
insert into test_a values ('d',0);
insert into test_a values ('d',8);
insert into test_a values ('d',6);
insert into test_a values ('d',4);
insert into test_a values ('d',3);
commit;
--杨毅给出的答案如下 (没有使用分析函数)
--测试结果显示没显示去重,不过与题干无关。
SELECT *
FROM TEST_A A
WHERE A.B IN
((SELECT MAX(B.B) FROM test_a B WHERE A.A = B.A) UNION
(SELECT MAX(C.B)
FROM TEST_A C
WHERE A.A = C.A
AND C.B NOT IN
(SELECT MAX(D.B) FROM TEST_A D WHERE A.A = D.A)))
ORDER BY A.A ASC, A.B DESC;
--本人答案 (使用分析函数)
SELECT * FROM (
SELECT a, b, ROW_NUMBER()
OVER (
PARTITION BY a ORDER BY b DESC
) Top2 FROM test_a
)
WHERE Top2 <= 2 ;
create table test_a
(
a varchar2(10),
b int
)
truncate table test_a;
insert into test_a values ('a',10);
insert into test_a values ('a',1);
insert into test_a values ('a',2);
insert into test_a values ('a',3);
insert into test_a values ('a',4);
insert into test_a values ('a',5);
insert into test_a values ('a',6);
insert into test_a values ('b',12);
insert into test_a values ('b',14);
insert into test_a values ('b',1);
insert into test_a values ('b',6);
insert into test_a values ('c',2);
insert into test_a values ('c',4);
insert into test_a values ('c',4);
insert into test_a values ('c',5);
insert into test_a values ('c',3);
insert into test_a values ('c',15);
insert into test_a values ('d',1);
insert into test_a values ('d',0);
insert into test_a values ('d',8);
insert into test_a values ('d',6);
insert into test_a values ('d',4);
insert into test_a values ('d',3);
commit;
--杨毅给出的答案如下 (没有使用分析函数)
--测试结果显示没显示去重,不过与题干无关。
SELECT *
FROM TEST_A A
WHERE A.B IN
((SELECT MAX(B.B) FROM test_a B WHERE A.A = B.A) UNION
(SELECT MAX(C.B)
FROM TEST_A C
WHERE A.A = C.A
AND C.B NOT IN
(SELECT MAX(D.B) FROM TEST_A D WHERE A.A = D.A)))
ORDER BY A.A ASC, A.B DESC;
--本人答案 (使用分析函数)
SELECT * FROM (
SELECT a, b, ROW_NUMBER()
OVER (
PARTITION BY a ORDER BY b DESC
) Top2 FROM test_a
)
WHERE Top2 <= 2 ;
相关文章推荐
- 项目经理面试中可能遇到的问题
- 面试遇到的问题1
- Android—面试四家公司遇到的问题总结
- 面试中遇到的问题 面试经历分享 易美设计 白豆腐
- 笔试和面试中遇到的问题(1)
- 关于面试遇到的一些问题
- Java基础面试遇到问题(一)
- 苹果面试过程中求职者可能遇到的问题
- 项目经理面试中可能遇到的问题(持续更新)
- 有关于面试常遇到的问题回答,以及解决方案。
- 【网络】面试中遇到的网络相关问题
- Android--面试中遇到的问题总结(三)
- 面试遇到的问题(不断更新)
- 面试所遇到的问题(1)
- 面试时遇到的一些问题
- 面试中遇到的问题
- 面试的时候遇到的问题:二叉树
- tcp/ip--面试中遇到几个问题
- 面试遇到的问题
- Linux面试时遇到的问题