私がすぐに目にする問題の1つは、日付にタイムスタンプデータ型を使用することです。これにより、2つの理由でSQLクエリが複雑になります。範囲を使用するか、where句で実際の日付に変換する必要がありますが、さらに重要なのは、今日の終値と昨日の終値に関心があると述べているので、市場が開いている日を追跡する必要があります-したがって、月曜日のクエリは火-金とは異なります。休日も考慮する必要があります。
mktDayのような列を追加し、市場が営業している日ごとにそれを増やします。別のアプローチは、計算を簡単にする「previousClose」列を含めることです。これは通常の形式に違反していると思いますが、クエリでの高価な自己結合を節約できます。
構造を変更できない場合は、自己結合を実行して昨日の終値を取得し、必要に応じて変化率を計算し、その変化率で並べ替えることができます。
以下は、mysql5.0.27を実行しているサーバーで実行されたEricのコードを少しクリーンアップしたものです
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_today.price > 0
and p_yest.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10
列名とエリックのエイリアスの一部は予約語だったので、バックティックに注意してください。
また、最初のテーブルにwhere句を使用すると、より安価なクエリになることにも注意してください。wheregetが最初に実行され、ゼロより大きく、今日の日付を持つ行で自己結合を試行するだけで済みます。
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_yest.price > 0
where p_today.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10