2016-04-15 11 views
2

私は以下のように構築されたテーブルを持っている:月次価格データ:オープン、高、低および閉じる

dpTicker dpDate  dpOpen  dpHigh  dpLow  dpClose  dpVolume dpAdjClose dpCreated   dpModified 
GLE.PA  2016-02-01 35.39  35.455  34.375  34.785  2951300  34.785  2016-02-06 13:33:40 2016-02-06 13:33:40 
GLE.PA  2016-02-02 34.515  34.565  32.165  32.575  7353600  32.575  2016-02-06 13:33:40 2016-02-06 13:33:40 
GLE.PA  2016-02-03 32.4  32.495  30.885  31.6  7007000  31.6  2016-02-06 13:33:40 2016-02-06 13:33:40 
GLE.PA  2016-02-04 32.075  32.38  30.67  31.98  8181000  31.98  2016-02-06 13:33:40 2016-02-06 13:33:40 
GLE.PA  2016-02-05 32.55  33.0  31.86  32.11  7056700  32.11  2016-02-06 13:33:40 2016-02-06 13:33:40 

データは毎日株価情報やテーブルがティッカーの数百(例えばGLEが含まれています。 PA)。各ティッカー(例:GLE.PA)には、それぞれの「営業日」のエントリがあります。

私の目的は、このデイリープライスのデータテーブルから月額料金の概要を照会することです。毎月のデータは、次のように構成されます。

  1. 月間オープン:dpOpen月の最初の営業日です。
  2. 月間高:月間最大(dp高)
  3. 月低い:月の分(dpLow)。
  4. 月閉じる:月の最後の営業日にdp閉じる。

    SELECT 
        strftime ('%Y-%m', dpDate) AS month,  
        (SELECT dpOpen 
         FROM DailyPrices 
         WHERE dpTicker = 'GLE.PA' 
         AND dpDate = 
         (SELECT min(dpDate) 
         FROM DailyPrices 
         WHERE strftime('%Y%m', dpDate) = '201509' 
         ) 
        ) AS Open, 
        max(dpHigh) AS High, 
        min (dpLow) AS Low, 
        (SELECT dpClose 
         FROM DailyPrices 
         WHERE dpTicker = 'GLE.PA' 
         AND dpDate = 
         (SELECT max(dpDate) 
         FROM DailyPrices 
         WHERE strftime('%Y%m', dpDate) = '201509' 
         ) 
        ) AS Close 
    FROM DailyPrices 
    WHERE dpTicker ='GLE.PA' 
    AND strftime('%Y%m', dpDate) = '201509'; 
    

    次のようにクエリの出力は次のとおりです:

    bash-3.2$ sqlite3 myShares < month.sql 
    month  Open  High  Low   Close  
    ---------- ---------- ---------- ---------- ---------- 
    2015-09  42.72  44.07  37.25  39.85  
    bash-3.2$ 
    

    以下で、私は、SQLite3の中に次のクエリを使用して、特定の月のデータを照会するために管理

クエリ私は高低の毎月の概要を生成することができます:

SELECT 
    strftime('%Y-%m', dpDate) AS Month, 
    max(dpHigh) AS High, 
    min(dpLow) AS Low 
FROM DailyPrices 
WHERE dpTicker ='GLE.PA' 
GROUP BY strftime('%Y%m', update); 
次のように

出力のスナップショットが見えます:

SELECT 
    strftime('%Y-%m', dpDate) AS Month, 
    dpOpen AS Open 
FROM DailyPrices 
WHERE dpTicker = 'GLE.PA' 
AND dpDate IN 
    (SELECT min(dpDate) 
     FROM DailyPrices 
     WHERE dpTicker = 'GLE.PA' 
     GROUP BY strftime('%Y%m', dpDate) 
    ); 

出力のスナップショット:次のクエリでは

bash-3.2$ sqlite3 myShares < monthly.sql 
Month  High  Low  
---------- ---------- ---------- 
2000-01  219.32  184.346 
2000-02  206.43  181.977 
2000-03  210.411  181.503 
2000-04  221.405  197.805 
2000-05  226.239  55.9199 
... 

、私は正しいオープンと類推することにより、正しい閉じるデータを抽出するために管理します私は、次のような出力を得るために、1つのクエリに、クエリ、month.sqlとopen.sqlを組み合わせるために苦労しています

bash-3.2$ sqlite3 myShares < Open.sql 
Month  Open  
---------- ---------- 
2000-01  218.846 
2000-02  200.269 
2000-03  206.525 
2000-04  201.312 
2000-05  215.908 
... 

:次のとおりである

Month Open High Low Close 
------- ----- ----- ----- ----- 
2015-01 42.79 42.79 33.69 35.18 
2015-02 35.39 35.46 26.61 32.42 
2015-03 32.32 37.65 31.93 32.48 
... 

この問題を解決する助けとなることは非常に感謝しています。 よろしく

GAM

+0

を実行しますが、すべての月のためにしているクエリですか? –

+0

はい、これは正しいです。 –

答えて

1

最初のクエリが検索特定の月を指し、3ヶ所があります。サブクエリで2つの発生を取り除きましょう。これは我々が名前で同じテーブルの他のインスタンスを参照することができるようにエイリアスを使用する必要があります:

SELECT 
    strftime ('%Y-%m', dpDate) AS month,  
    (SELECT dpOpen 
     FROM DailyPrices 
     WHERE dpTicker = 'GLE.PA' 
     AND dpDate = 
     (SELECT min(dpDate) 
     FROM DailyPrices AS DP2 
     WHERE strftime('%Y%m', DP2.dpDate) = strftime('%Y%m', DP1.dpDate) 
     ) 
    ) AS Open, 
    max(dpHigh) AS High, 
    min (dpLow) AS Low, 
    (SELECT dpClose 
     FROM DailyPrices 
     WHERE dpTicker = 'GLE.PA' 
     AND dpDate = 
     (SELECT max(dpDate) 
     FROM DailyPrices AS DP2 
     WHERE strftime('%Y%m', DP2.dpDate) = strftime('%Y%m', DP1.dpDate) 
     ) 
    ) AS Close 
FROM DailyPrices AS DP1 
WHERE dpTicker ='GLE.PA' 
AND strftime('%Y%m', dpDate) = '201509'; 

今だけ最も外側の問合せは月知っている必要があることを、我々は単に、GROUP BYでフィルタを置き換えることができます

SELECT 
    strftime ('%Y-%m', dpDate) AS month,  
    (...) AS Open, 
    max(dpHigh) AS High, 
    min (dpLow) AS Low, 
    (...) AS Close 
FROM DailyPrices 
WHERE dpTicker ='GLE.PA' 
GROUP BY strftime('%Y%m', dpDate); 

オープン/クローズサブクエリはBY/ORDER LIMITを使用することによって単純化することができることに注意してください:

(SELECT dpOpen 
FROM DailyPrices 
WHERE dpTicker = 'GLE.PA' 
    AND ... dpDate ... 
ORDER BY dpDate ASC 
LIMIT 1) AS Open 
0

ありがとうCL !!これはSQLite初心者、特にALIASESの使用のための良い学習です。

bash-3.2$ sqlite3 myShares < tst.sql 
month  Open  High  Low   Close  
---------- ---------- ---------- ---------- ---------- 
2006-03  75.4675  76.5852  70.4136  74.4956 
2006-04  75.0787  75.9048  70.5108  72.7948 
2006-05     77.0225  68.5184  70.7538 
2006-06  70.5594  73.4751  64.7767  72.7462 
2006-07  72.5518  75.2245  68.2269  74.0582 
bash-3.2$ 

あなたはお気づきのように、2006年5月の月のオープン価格:

あなたの提案は、テスト実行のカップルを実行している場合、一般的に良好な結果が、しかし、私は次のスタイルの時折のエラーに気づい生成します不足している。 SQLiteデータベース内ティッカーのそれぞれについて

bash-3.2$ sqlite3 myShares < test.sql 
dpTicker dpDate  dpOpen  dpHigh  dpLow  dpClose  dpVolume dpAdjClose dpCreated   dpModified   
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------------- ------------------- 
BNP.PA  2006-04-26 72.0173  73.1835  72.0173  72.892  2623400  48.8861  2015-12-08 12:04:22 2015-12-08 12:04:22 
BNP.PA  2006-04-27 73.8153  74.0096  72.5032  73.6209  6001400  49.375  2015-12-08 12:04:22 2015-12-08 12:04:22 
BNP.PA  2006-04-28 73.4751  73.9611  72.6976  72.7948  4133300  48.8209  2015-12-08 12:04:22 2015-12-08 12:04:22 
BNP.PA  2006-05-02 72.5518  73.5723  72.3574  73.2807  3085400  49.1468  2015-12-08 12:04:22 2015-12-08 12:04:22 
BNP.PA  2006-05-03 73.8639  74.0096  72.5518  72.649  3290400  48.7231  2015-12-08 12:04:22 2015-12-08 12:04:22 
BNP.PA  2006-05-04 72.892  73.5237  72.2602  73.3779  3640300  49.212  2015-12-08 12:04:22 2015-12-08 12:04:22 
BNP.PA  2006-05-05 73.6209  74.8357  73.4751  74.7872  3255600  50.1572  2015-12-08 12:04:22 2015-12-08 12:04:22 
bash-3.2$ 

が、私は16年間で約4これらのエラーの一般的に持っている:私は、データが実際に存在することを確認しました。

私のSQLite初心者の知識が届く限り、テーブルのデータは問題ありません。

場合によっては、クエリが要約レコードをジャンプする理由は何ですか?一般的に、乖離はオープンプライスで発生しますが、時折クローズ価格で発生します。

敬具、

GAMレコードの

、以下は、私はあなたが最初の問合せをしたい

SELECT 
    strftime ('%Y-%m', dpDate) AS month,  
    (SELECT dpOpen 
    FROM DailyPrices 
    WHERE dpTicker = 'BNP.PA' 
     AND dpDate = 
     (SELECT min(dpDate) 
     FROM DailyPrices AS DP2 
     WHERE strftime('%Y%m', DP2.dpDate) = strftime('%Y%m', DP1.dpDate) 
     ) 
    ORDER BY dpDate ASC 
    LIMIT 1) AS Open, 
    max(dpHigh) AS High, 
    min (dpLow) AS Low, 
    (SELECT dpClose 
     FROM DailyPrices 
     WHERE dpTicker = 'BNP.PA' 
     AND dpDate = 
     (SELECT max(dpDate) 
     FROM DailyPrices AS DP2 
     WHERE strftime('%Y%m', DP2.dpDate) = strftime('%Y%m', DP1.dpDate) 
     ) 
    ) AS Close 
FROM DailyPrices AS DP1 
WHERE dpTicker ='BNP.PA' 
AND strftime('%Y-%m', dpDate) > '2006-02' 
AND strftime('%Y-%m', dpDate) < '2006-08' 
GROUP BY strftime('%Y-%m', dpDate); 
+0

はSELECT dpOpenとdpCloseを改良: –

+0

(DailyPrices WHERE dpTicker = 'GLE.PA' とdpDate = FROM dpClose を選択(dpTicker = 'GLE.PA' DP2 AS DailyPrices FROM最大(dpDate) を選択します\t \tとstrftime( '%Y%m'、DP2.dpDate)= strftime( '%Y%m'、DP1.dpDate) ) )閉じる –

関連する問題