求按1000小时区间排序后再按Points降序的SQL语句
按1000小时区间排序后再按Points降序的SQL实现
我明白你想要的效果:先把用户按1000小时的区间分组排序(大的区间在前),然后在每个区间内部再按Points从高到低排列。原来的SQL直接按Hours降序,会导致同区间内的记录按Hours排序,而不是Points,这就是问题所在。
解决方案:用区间分组标识来排序
我们可以通过计算每个Hours所属的1000小时区间,把这个区间作为第一排序条件,然后再按Points降序。具体来说,用FLOOR(Hours / 1000)可以得到区间的整数标识(比如8005属于第8区间,7200属于第7区间),然后按这个标识降序,再按Points降序。
对应的SQL语句如下:
SELECT * FROM CurrencyUser ORDER BY FLOOR(Hours / 1000) DESC, Points DESC LIMIT 6;
针对你数据的执行结果
用这条SQL处理你给出的数据,会得到你期望的排序:
+--------+-------+
| Points | Hours |
+--------+-------+
| 27 | 8005 | -- 第8区间(8000-8999),该区间仅这一条记录
| 200 | 7100 | -- 第7区间(7000-7999),Points更高的排在前面
| 125 | 7200 | -- 第7区间的第二条记录
| 575 | 1050 | -- 第1区间(1000-1999),Points最高
| 567 | 1070 | -- 第1区间的第二条记录
| 450 | 1020 | -- 第1区间的第三条记录
+--------+-------+
补充说明
- 如果你用的是MySQL,也可以用整数除法简化:
Hours DIV 1000,效果和FLOOR(Hours/1000)一致。 - 这个逻辑的核心是先通过数学运算把
Hours映射到对应的区间组,再以组为单位排序,组内再按Points排序,完全不需要用到CASE或BETWEEN(当然如果想用CASE也可以实现,但用除法取整更简洁)。比如用CASE的写法会比较繁琐,比如:
SELECT * FROM CurrencyUser ORDER BY CASE WHEN Hours >= 8000 THEN 8 WHEN Hours >=7000 THEN7 WHEN Hours >=1000 THEN1 ELSE 0 END DESC, Points DESC LIMIT6;
显然这种写法不如除法取整灵活,尤其是当区间范围很大的时候。
内容的提问来源于stack exchange,提问作者kobi
相关产品推荐
相关产品推荐

