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

Group Byと自己参加を使用して、最小、最大、始値、終値の日次価格再設定セットを返す方法は?

    だからあなたが欲しい:

    • エイリアスC 特定の日のグループ内のすべての行に対応するため、MAX()を使用できます およびMIN() そのグループの行の上に。
    • エイリアスC2 特定の日の最後の行に対応します。
    • エイリアスC3 C2より後の行に対応する 同じ日に。何も見つからない場合、つまりC3.* NULLの場合、C2 その日の最新です。

    これは多くの場合、greatest-n-per-groupというラベルが付けられています クエリを実行すると、StackOverflowで頻繁に発生します。これが私があなたのテストデータのためにテストした解決策ですが、他の解決策と議論のためにあなたの質問に追加したタグに従うことができます。

    編集: 始値と終値の両方の要件を逃しました。以下を編集します。

    SELECT DATE_FORMAT(C.`DTE`, '%m/%d/%Y') AS trading_day, 
      MIN(C.`PRICE`) AS min_price, 
      MAX(C.`PRICE`) AS max_price, 
      Copen.`PRICE` AS opening_price,
      Cclose.`PRICE` AS closing_price 
    FROM `CHART_DATA` AS C 
    INNER JOIN `CHART_DATA` AS Cclose 
      ON DAY(C.`DTE`) = DAY(Cclose.`DTE`) 
    LEFT OUTER JOIN `CHART_DATA` AS Cclose_later 
      ON DAY(C.`DTE`) = DAY(Cclose_later.`DTE`) AND Cclose.`DTE` < Cclose_later.`DTE`
    INNER JOIN `CHART_DATA` AS Copen 
      ON DAY(C.`DTE`) = DAY(Copen.`DTE`) 
    LEFT OUTER JOIN `CHART_DATA` AS Copen_earlier 
      ON DAY(C.`DTE`) = DAY(Copen_earlier.`DTE`) AND Copen.`DTE` < Copen_earlier.`DTE`
    WHERE Cclose_later.`DTE` IS NULL AND Copen_earlier .`DTE` IS NULL 
    GROUP BY trading_day;
    


    1. 手順には、テーブルに対する個別のアクセス権が必要ですか?

    2. GCM登録IDをMySQLに一意に保存する方法

    3. 存在しない場合はINSERTMysql

    4. SQLServerの複雑さを軽減するためのヒント