SELECT device, value, id
FROM myTable s
WHERE (SELECT COUNT(*) FROM myTable f WHERE f.id = s.id AND f.value >= s.value) <= 2
これは動作しますが、問題は、それが大規模なデータをオーバー実行するのに数分かかります。数秒で起こるより速い方法がありますか?私がしようとしているのは、両方の値が昇順でソートされている行から2つの項目だけを取ることです。
id | device | value
1 123 40
1 456 30
1 789 45
2 12 10
2 11 9
以上が私のテーブルです(私はない私のデザイン、IDは一意ではありません知っているが、それは目的を持っている)ですが、id内のid = 1を言うことができます、私は、ID、デバイスとの値を選択します最小2なので、私の結果は1、123、30、1、456、40などとなります。
また、誰かが知っていれば、ソートしたデータをデータベースに挿入すれば、同じ順序で読み返すことができますか?クエリ以下
あなたの最初の質問についてあなたが参加しようとしているように見えます)。あなたの2番目の質問について:いつも "ORDER BY" – PeeHaa
"*ソートされたデータをデータベースに挿入すると、同じ順序で読み返すことが保証されます*"と指定する必要はありません。クエリで 'order by 'を使用していない限り、データベースは行を返す順序を自由に選択できます。 –
特に、適切なインデックスが利用できない場合、相関サブクエリは避けます(' id' 'value'を先頭の列としています)。各行の「最高値」を持つ行を探していたら、恐らく**' dense_rank' **のようなウィンドウ関数を使用します。参照:https://www.postgresql.org/docs/9.5/static/functions-window.html(まったく同じ質問は見つけられませんか?)結果が特定の順序で返されるようにするには、 ORDER BY'節。 – spencer7593