[解決済み】PostgreSQLのDISTINCT ONで異なるORDER BYを指定した場合
2022-04-02 05:37:02
質問
このクエリを実行したいのですが、どうすればいいですか?
SELECT DISTINCT ON (address_id) purchases.address_id, purchases.*
FROM purchases
WHERE purchases.product_id = 1
ORDER BY purchases.purchased_at DESC
でも、こんなエラーが出ます。
PG::Error: ERROR: SELECT DISTINCT ON 式は、最初の ORDER BY 式と一致しなければなりません。
追加
address_id
を最初の
ORDER BY
式はエラーを消しますが、私は本当に
address_id
. による順序付けなしで行うことは可能ですか?
address_id
?
解決方法は?
ドキュメントによると
<ブロッククオートDISTINCT ON ( 式 [, ...] ) は、与えられた式が等しいと評価される各行の集合の最初の行だけを保持します。[各セットの最初の行は、ORDER BYを使用して目的の行が最初に表示されるようにしない限り、予測不可能であることに注意してください。[DISTINCT ON式は、一番左のORDER BY式と一致しなければなりません。
そのため
address_id
をオーダーバイに追加してください。
また、各製品の最新の購入商品を含む全行が必要な場合は
address_id
でソートした結果を
purchased_at
の場合、グループあたりの最大Nの問題を解こうとしていることになりますが、これは次のようなアプローチで解くことができます。
ほとんどのDBMSで動作するはずの一般的な解決策。
SELECT t1.* FROM purchases t1
JOIN (
SELECT address_id, max(purchased_at) max_purchased_at
FROM purchases
WHERE product_id = 1
GROUP BY address_id
) t2
ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at
ORDER BY t1.purchased_at DESC
hkf さんの回答に基づいて、より PostgreSQL に近い解決策を提案します。
SELECT * FROM (
SELECT DISTINCT ON (address_id) *
FROM purchases
WHERE product_id = 1
ORDER BY address_id, purchased_at DESC
) t
ORDER BY purchased_at DESC
問題の明確化、拡張、解決はここで。 ある列で並べられ、別の列で区別される行を選択する
関連
-
[解決済み】使用されるSELECT文は列の数が異なる(REDUX!)
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] PostgreSQLの "DESCRIBE TABLE"
-
[解決済み] PostgreSQL コマンドラインユーティリティ: psql を終了する方法
-
[解決済み] LINQで複数の "order by "を使用する
-
[解決済み] PostgreSQLのユーザーパスワードを変更する方法を教えてください。
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み] PostgreSQLからのPL/pgSQL出力をCSVファイルに保存する
-
[解決済み] 最初の行への結合方法
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ストアドプロシージャーのエラー ORA-06550
-
[解決済み】PL/SQL SELECTに複数のCOUNT(DISTINCT xxx)を指定すると、予期しない結果になる。
-
[解決済み】SQL Server: 無効なカラム名
-
[解決済み] ''付近の構文が正しくない
-
[解決済み] SQLクエリ「00904. 00000 - "%s: 無効な識別子".
-
[解決済み] ORA-00920: 無効な関係演算子
-
[解決済み] ORA-04063: ビューにエラーがあります
-
[解決済み] SQLエラーです。ORA-00922: オプションがないか無効です。
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] Postgresの場合。1つのカラムだけ区別される