それぞれの最新の 4 つの日付を取得したいと考えていましたsymbolid
。ここでコードを次のように調整しました。
set @num := 0, @symbolid := '';
select symbolid, date,
@num := if(@symbolid = symbolid, @num + 1, 1) as row_number,
@symbolid := symbolid as dummy
from projections
group by symbolid, date desc
having row_number < 5
次の結果が得られます。
symbolid date row_number dummy
1 '2011-09-01 00:00:00' 1 1
1 '2011-08-31 00:00:00' 3 1
1 '2011-08-30 00:00:00' 5 1
2 '2011-09-01 00:00:00' 1 2
2 '2011-08-31 00:00:00' 3 2
2 '2011-08-30 00:00:00' 5 2
3 '2011-09-01 00:00:00' 1 3
3 '2011-08-31 00:00:00' 3 3
3 '2011-08-30 00:00:00' 5 3
4 '2011-09-01 00:00:00' 1 4
...
明らかな疑問は、なぜ ごとに 3 行しか得られないのsymbolid
か、そしてなぜ 1、3、5 の番号が付けられているのかということです。いくつかの詳細:
- インデックスを強制する場合としない場合の両方を試してみましたが (ここで見られるように)、両方の方法で同じ結果が得られました。
- 日付は正しいです。つまり、リストには ごと
symbolid
に上位 3 つの日付が正しく表示されますが、row_number の値はずれています - 「having」ステートメントを使用しない場合、行番号は正しいです。つまり、最新の日付は 1、次に新しい日付は 2 などです。
明らかに、row_number
計算フィールドは「having」句の影響を受けていますが、修正方法がわかりません。
「having」を「having row_number < 7」(6 は 5 と同じ) に変更できることはわかっていますが、それは非常に見苦しく、「動作」させるにはどうすればよいか知りたいと思います。