查询结果里包含子查询—分组排序取前几的问题

逛贴吧看到有个面试sql的题目,他答案根本风牛马不相及,想起来最近看到的那个分组排序取前几的。

1.贴吧里面试题的sql

 要求结果是:

sql: 

--结果是day,success,fail数量
select day_id as day,
(select count(1) from r_test b where a.day_id = b.day_id and b.result = 'success') as success,
 (select count(1) from r_test c where a.day_id = c.day_id and c.result = 'fail') as fail
from r_test a group by day_id order by day_id asc

 

 

2.分组排序取前几的,例如先建个表:按group分组,取分数前3的。oracle有分组排序取前几的函数。

a.不用函数写,不重复名次时候没问题(但是名次重复了有问题)。

 

 主要想法是多一个字段给排序用

 

b.用oracle分组排序函数写。ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

也是给它多一个字段

 

分组排序这个问题

改一下数:B分组里取前两名,并列的两名都要查询到。

表数据:

上面那两条sql会造成:

第一条,用a.score > = b.score 这个条件,如果并列第二名,会出现nm这个字段查出来为1,3,3没有2.  所以这么写还是错的。第一条查不出第二名因为nm为1,3,3 ;

第二条只能查出一个并列的另一个查不出来。

第二条结果:

 刚刚想了想,最终解决办法:

针对我的这种要求(且取前两名,并列的两名都要查询到。),不使用函数而使用第一种做法,改一下后面那个nm<=2的条件

有更好的办法再补充。

 

posted @ 2018-12-16 16:08  圣金巫灵  阅读(1160)  评论(0编辑  收藏  举报