使用ORDER BY进行SQL高级排序

时间:2014-09-24 15:49:30

标签: sql sql-order-by

我无法弄清楚如何使用ORDER BY子句对我的一些结果进行排序。我正在使用PostgreSQL,我有一个表记录用户在我的应用程序中执行的操作。它记录了user_id,message_date,message_subject。这是我从该表中选择的当前SQL语句:

SELECT 
  message_subject, 
  count (message_subject) AS message_count,
  user_id,
  message_date,

FROM 
  view_app_message

WHERE
  message_date >= $P{FROM} AND message_date <= $P{TO} AND
  belongs_to IN ($P{RESTAURANT_IDS})

GROUP BY
  message_date,
  user_id,
  message_subject

ORDER BY
  message_date,
  user_id,
  message_count DESC

这给了我看起来像这样的结果:

message_subject | message_count | user_id | message_date
   login        |       2       |    1    | 2014.04.01
   error        |       1       |    1    | 2014.04.01
   payment      |       1       |    1    | 2014.04.01
   login        |       7       |    2    | 2014.04.01
   error        |       5       |    2    | 2014.04.01
   login        |       10      |    1    | 2014.04.02
   error        |       9       |    1    | 2014.04.02
   login        |       2       |    2    | 2014.04.02
   payment      |       1       |    2    | 2014.04.02

我想要的是按每个用户的所有message_count的总和来订购这些记录。例如,用户1有来自2014.04.01的4条消息,用户2有12条消息。用户2的记录应该在用户1的记录之前降序排序,如下所示:

message_subject | message_count | user_id | message_date
   login        |       7       |    2    | 2014.04.01
   error        |       5       |    2    | 2014.04.01
   login        |       2       |    1    | 2014.04.01
   error        |       1       |    1    | 2014.04.01
   payment      |       1       |    1    | 2014.04.01

我无法理解,因为我很傻。有人可以帮帮我吗? :d

1 个答案:

答案 0 :(得分:0)

您很幸运,因为order by子句中允许使用窗口函数:

ORDER BY message_date,
         sum(count (message_subject)) over (partition by message_date, user_id) desc,
         user_id,
         message_count DESC