查询结果里包含子查询—分组排序取前几的问题
逛贴吧看到有个面试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的条件
有更好的办法再补充。