You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:33:34