在 PostgreSQL 中,我想一次获取每个用户并按日期排序。
这是我的查询:
SELECT id, useridx, isread, message, date
  FROM messages
 WHERE isread = 1
 GROUP BY useridx
 ORDER BY date DESC
这是一个示例数据:
------------------------------------------------------
+  id  |  useridx |  isread  |  messsage |  date     +
------------------------------------------------------
   1   |  1       |  0        | Hello    |  2012-01-01    
   2   |  2       |  1        | Hi       |  2012-01-02    
   3   |  3       |  1        | Test     |  2012-01-03    
   4   |  3       |  0        | My Msg   |  2012-01-04    
   5   |  4       |  1        | sadasd   |  2012-01-05    
   6   |  4       |  1        | sdfsdfd  |  2012-01-06    
   7   |  4       |  0        | sdfsdfsd |  2012-01-07    
   8   |  5       |  0        | 5345634  |  2012-01-08
   9   |  6       |  0        | sdfdfsd  |  2012-01-09
   10  |  7       |  0        | sdfsdfsf |  2012-01-10
------------------------------------------------------
现在,我要做的是通过 useridx 对它们进行分组并按日期排序来获取此表。
预期结果:
------------------------------------------------------
+  id  |  useridx |  isread  |  messsage |  date     +
------------------------------------------------------  
   6   |  4       |  1        | sdfsdfd  |  2012-01-06 
   3   |  3       |  1        | Test     |  2012-01-03  
   2   |  2       |  1        | Hi       |  2012-01-02    
------------------------------------------------------
实际结果
ERROR:  column "messages.date" must appear in the GROUP BY clause or be used in an aggregate function
我也不想分组日期。我只想用 useridx 分组并按日期 DESC 对它们进行排序。
任何帮助/想法表示赞赏!
注意:我也尝试过 Distinct。不符合我的需要或我做错了。
我很困惑,被困在DISTINCT ON和rank()方法之间。
结论:对于在这里遇到相同问题的人,可以将其作为答案阅读。@kgrittn 和 @mu 都太短了,答案都是正确的。我将继续在我的项目中使用答案和模式,并且及时我可以理解哪个是最好的-我猜-。因此,选择其中之一并继续您的工作。你会没事的。
上次更新:有时,Distinct On 会从结果中排除一些 id。假设我有一个 id 列,我有 6 行是相同的。因此,从结果中排除它是不同的,但 rank() 只是结果。所以,使用 rank()!