2

私は株価データを処理しており、このクエリを実行して、たとえばGoogleの月額1つの価格を取得しています(平日の価格の表から)。

SELECT * FROM pricedata WHERE symbol='GOOG' GROUP BY symbol,month(date),year(date)

2012-07-02
2012-06-01
2012-05-01

WHERE句を削除すると、次のように、最初の日付ではなく、その月の最後の日付が返されます(もちろん、テーブル内のすべての記号が表示されるため、さらに多くの行が返されます)。

SELECT * FROM pricedata GROUP BY symbol,month(date),year(date)

2012-07-31
2012-06-29
2012-05-31

「サーバーは各グループから任意の値を自由に選択できる」ことを理解しているので、最初のクエリが希望どおりに機能するのは幸運なことですが、変更が発生する理由を知りたいと思います。

毎月の最初の値を一貫して取得するための高速なソリューションはありますか?同様の質問は見つかりませんでしたが、そこにある可能性があります... 2番目のクエリは重要ではありませんが、月次のみのレコード用に縮小サイズのテーブルを作成しようとして、この問題が発生しました。

4

1 に答える 1

1

なぜ変化が起こるのか知りたいのですが。

サーバーはグループから任意の値を自由に選択できますが、実際には、サーバーは最初に見つけた値を選択します。インデックスがオンになっている場合は、インデックスでsymbol並べ替えられるときに最初のインデックスが選択されます。WHERE句を削除すると、別のインデックスまたはクラスター化されたキーが使用されます。これは異なる順序で並べ替えられるため、サーバーが最初に検出する行は異なります。

基本的に、特定の値を取得することに依存するべきではありません。ドキュメントに記載されているように、サーバーは任意の値を自由に選択でき、選択する値は指定されていません。

毎月の最初の値を一貫して取得するための高速なソリューションはありますか?

SELECT symbol, MIN(date) AS date
FROM pricedata
GROUP BY symbol, month(date), year(date)
于 2012-08-25T22:29:32.160 に答える