我在排序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,这就是为什么它不是我需要的原因。
抱歉我的英文不好,感谢所有回复。
答案 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
希望这会有所帮助。