別の SO 投稿 ( SQL: How to keep rows order with DISTINCT? ) によると、distinct はソートに関してはかなり未定義の動作をします。
質問があります:
select col_1 from table order by col_2
これは次のような値を返すことができます
3
5
3
2
次に、順序を保持するこれらの個別のものを選択する必要があります。つまり、必要です
select distinct(col_1) from table order by col_2
戻る
3
5
2
だがしかし
5
3
2
これが私が実際にやろうとしていることです。col_1 はユーザー ID で、col_2 はそのユーザーによるログイン タイムスタンプ イベントです。したがって、同じユーザー (col_1) が何度もログインできます。システムで見られたユーザーの履歴リストを作成しようとしています。「私たちの最初のユーザーはこれまでに、2 番目のユーザーはこれまでに」などと言えるようにしたいと思います。
その投稿はグループ化を使用することを提案しているようですが、グループ化は行の順序を返すことを意図していないため、グループ化は順序を保持しないように見えるため、ここでこれがどのように、またはなぜ適用されるのかわかりません。実際、別の SO 投稿では、group by が探している順序を破棄する例を示しています。「Peter」を参照してください。後者の結果を保証する方法はありますか?奇妙なことに、DISTINCT 句を実装している場合、最初に必ず順序付けを行い、次に結果を取得してリストの線形スキャンを実行し、順序付けを自然に保持するため、動作がなぜそうなのかわかりません。未定義。
編集:
皆さん、ありがとうございました!IMSoP の回答を受け入れました。これは、私が試してみることができるインタラクティブな例があっただけでなく (SQL Fiddle に参加してくれてありがとう)、単に「これを行う」のではなく、いくつかのことが機能した理由を説明したからです。 . 具体的には、GROUP BY が group by 以外の他の列の値を破棄しない (むしろ、ある種の内部リストに保持する) こと、およびこれらの値を ORDER BY 句で調べることができることは不明でした。