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 is too short の両方の答えは正しいです。私は自分のプロジェクトで回答とスキーマの両方を引き続き使用しますが、そのうちにどちらが最適かを理解できるようになります。したがって、それらのいずれかを選択して、作業を続けてください。あなたは大丈夫です。
Last Update : Distinct On が一部の ID を結果から除外することがあります。id列があり、同じ6行あるとしましょう。したがって、結果から除外すると区別されますが、rank() は単に結果になります。したがって、rank() を使用してください。