sql >> データベース >  >> RDS >> Mysql

MySQLを使用して1日の価格変動の上位%を計算するにはどうすればよいですか?

    私がすぐに目にする問題の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
    


    1. mysqlからPHPで配列を作成します

    2. Postgresデータベースの複数のスキーマにhstoreをインストールする最良の方法は?

    3. PHPデータベースダンプスクリプト-何か問題はありますか?

    4. mysqlから最後のレコードを取得する