sql中基于频率的排序

时间:2014-08-26 12:23:07

标签: sql sorting frequency

我在排序sql表时遇到问题。

我有这个:

+------+------+
| col1 | col2 |
+------+------+
| a    |    1 |
| b    |   3  |
| c    |    4 |
| d    |    3 |
| e    |    2 |
| f    |    2 |
| g    |    2 |
| h    |    1 |
+------+------+

我需要这个:

+------+------+
| col1 | col2 |
+------+------+
| e    |    2 |
| f    |    2 |
| g    |    2 |
| a    |    1 |
| h    |    1 |
| b    |    3 |
| d    |    3 |
| c    |    4 |
+------+------+

我尝试使用COUNT(),但它仅适用于GROUP OF,这就是为什么它不是我需要的原因。

抱歉我的英文不好,感谢所有回复。

3 个答案:

答案 0 :(得分:3)

如果数据库支持OVER子句,那么它很简单:

SELECT t.id, t.value
FROM t
ORDER BY count(*) over (partition by value) DESC

请参阅SQL小提琴 - http://sqlfiddle.com/#!6/ce805/3

答案 1 :(得分:1)

我明白了。您希望按值的频率进行排序。 SQL的大多数方言都支持窗口函数,所以这可以达到你想要的效果:

select t.col1, t.col2
from (select t.*, count(*) over (partition by col2) as cnt
      from table t
     ) t
order by cnt desc, col2;

另一种写作方式是使用join和聚合:

select t.*
from table t join
     (select col2, count(*) as cnt
      from table t
      group by col2
     ) tt
     on t.col2 = tt.col2
order by tt.cnt desc, t.col2;

答案 2 :(得分:1)

如果我理解你的排序顺序,你想首先得到Col2值最多的行等等......

以下是获得结果的建议:

SELECT T.Col1, T.Col2
FROM YourTable T
ORDER BY (SELECT COUNT(*)
FROM YourTable T2
WHERE T2.Col2 = T.Col2) DESC, T.Col2 DESC, T.Col1 ASC

希望这会有所帮助。