逛贴吧看到有个面试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的条件

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

有更好的办法再补充。

 

相关文章:

  • 2022-12-23
  • 2021-06-26
  • 2022-12-23
  • 2021-05-08
  • 2021-07-18
  • 2021-09-25
  • 2021-05-26
猜你喜欢
  • 2022-01-08
  • 2022-12-23
  • 2021-11-28
  • 2021-06-08
  • 2022-12-23
  • 2021-12-18
  • 2021-11-27
相关资源
相似解决方案