按间隔对第 2 列进行排序并按顺序对第 1 列进行排序

Posted

技术标签:

【中文标题】按间隔对第 2 列进行排序并按顺序对第 1 列进行排序【英文标题】:sort column 2 by interval and sort column 1 desc 【发布时间】:2018-03-18 13:45:03 【问题描述】:

我需要一个 SQL 语句,它首先按 1000 Hours 步的间隔排序,然后按 DESC 顺序对 Points 进行排序。 在这个例子中,我不知道如何使用CaseBetween/case

当前结果 SELECT * FROM CurrencyUser ORDER BY Hours DESC, Points DESC LIMIT 6

+--------+-------+
| Points | Hours |
+--------+-------+
|    27  |  8005 |
|    125 |  7200 |
|    200 |  7100 |
|    567 |  1070 |
|    575 |  1050 |
|    450 |  1020 |
+--------+-------+

这是我想要的结果

+--------+-------+
| Points | Hours |
+--------+-------+
|    27  |  8005 |
|    200 |  7100 |
|    125 |  7200 |
|    575 |  1050 |
|    567 |  1070 |
|    450 |  1020 |
+--------+-------+

Points 和 Hours 都是普通整数

【问题讨论】:

【参考方案1】:

使用FLOOR(Hours / 1000)Hours DIV 1000

SELECT *
FROM  CurrencyUser
ORDER BY Hours DIV 1000 DESC, Points DESC

请注意,转换为UNSIGNED 将充当ROUND(),因此7400 将在7 组中,但76008 组中。您的示例数据未涵盖此案例。

运行此测试以查看差异:

set @Hours = 7600;

select cast(@Hours/1000 as unsigned)
     , round(@Hours/1000)
     , floor(@Hours/1000)
     , @Hours DIV 1000

演示:http://rextester.com/DZYZ80148

【讨论】:

【参考方案2】:
SELECT * FROM  CurrencyUser ORDER BY cast(Hours/1000 as int) DESC, Points DESC LIMIT 6;

【讨论】:

它与 SELECT * FROM CurrencyUser ORDER BY cast(Hours/1000 as SIGNED) DESC, Points DESC LIMIT 6 合作过,非常感谢

以上是关于按间隔对第 2 列进行排序并按顺序对第 1 列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何对 QTreeWidget 列进行排序?

我想用shell排序,一共两列,先用第一列进行降序,然后对第一列相同的数,在第二列进行降序排列,怎么办?

GBQ中的窗口函数按顺序排序行为规范

Pandas 按值 1 对列进行分组并按频率排序

php 二维数组按某个字段排序

对Dev的GridControl/GridView控件进行分组并展开操作