【问题标题】:Frequency based sort in sql [duplicate]sql中基于频率的排序[重复]
【发布时间】:2014-10-19 18:35:07
【问题描述】:

我在排序 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,这就是为什么它不是我需要的。

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

【问题讨论】:

  • 别害羞。你想要的神秘排序顺序是什么?
  • 我想在排序表的顶部有最受欢迎的产品类型,但我不想按产品类型分组产品。
  • OP 试图解释标题中的排序顺序。他/她似乎想要按频率排序的 col2 值,所以“2”是第一个,因为它出现了 3 次。
  • 您使用的是哪个数据库?
  • 具有通用 SQL 答案的类似问题 - stackoverflow.com/questions/8467997/…

标签: sql sorting frequency


【解决方案1】:

如果数据库支持OVER子句那就很简单了:

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

参见 SQL Fiddle - http://sqlfiddle.com/#!6/ce805/3

【讨论】:

    【解决方案2】:

    我明白了。您想按值的频率排序。大多数 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;
    

    【讨论】:

      【解决方案3】:

      如果我很好理解您的排序顺序,您希望首先获得 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
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        • 2013-05-20
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多