0

次の 3 つのテーブルを検討してください。

daterange     stocks                               companies
-----------   ----------------------------------   ----------------
_date         stock_id  nyse_date   open   close   stock_id  name
-----------   ----------------------------------   ----------------
2011-03-11    1         2011-03-11  40.50  40.60   1         Alcoa
2011-03-12    1         2011-03-14  40.62  41.04   2         Apple
2011-03-13    1         2011-03-15  41.00  41.20   .           .
2011-03-14    1         2011-03-16  41.15  42.00   .           .
2011-03-15    1         2011-03-18  41.50  41.80   100       Xerox
2011-03-16
2011-03-17
2011-03-18

daterangeには、2011 年 3 月 11 日から 9 月 1 日までの連続する一連の日付が含まれています。同じ期間のおよび100 株の価格情報stocksが含まれています。株/会社は にあります。openclosecompanies

週末2011-03-12および2011-03-13休暇中 (例: 2011-03-17) は、価格情報を利用できません。

必要なのは、 の各日付のリストopenclose価格情報です。に価格情報がない がある場合は常に、最新の既知の価格情報を入力する必要があります。daterange_datedaterangestocks

したがって、Alcoa ( stock_id 1) の場合、与えられたdaterange日付が与えられると、出力は次のようになります (* = 最後の既知の値から取得):

stock_id _date       open   close 
---------------------------------
1        2011-03-11  40.50  40.60
1        2011-03-12  40.50  40.60 *
1        2011-03-13  40.50  40.60 *
1        2011-03-14  40.62  41.04
1        2011-03-15  41.00  41.20
1        2011-03-16  41.15  42.00
1        2011-03-17  41.15  42.00 *
1        2011-03-18  41.50  41.80

...実際には、その後に 9 月 1 日までのすべての日付が続き、その後stock_id2 が続きます (例opencloseは示されていません)。

2        2011-03-11  10.11  10.15
2        2011-03-12  10.11  10.15 * 
2        2011-03-13  10.11  10.15 *
2        2011-03-14  10.20  10.24
.        .
.        .

これは MySQL で可能でしょうか? 別の方法として、PHP を使用して から日付をダウンロードしdaterange、ループしてstocks、特定の日付のエントリがない場合に入力することもできます。しかし、MySQL の方がはるかに高速であると思います。

どんな助けでも大歓迎です:-)

4

1 に答える 1

1

私はこれを試してみましたが、必要なものが得られるようです。

SELECT DISTINCT 1 AS Stock_id, D._date, 
       (SELECT S2.Open From Stocks S2
        WHERE S2.Stock_id=1
          AND S2.nyse_date < DATE_ADD(D._date, INTERVAL 1 DAY) 
        ORDER BY S2.nyse_date DESC
        LIMIT 1) AS open,
       (SELECT S3.Close From Stocks S3
        WHERE S3.Stock_id=1
          AND S3.nyse_date < DATE_ADD(D._date, INTERVAL 1 DAY) 
        ORDER BY S3.nyse_date DESC
        LIMIT 1) AS close
FROM daterange D LEFT JOIN stocks S1 ON D._date=S1.nyse_date
ORDER BY D._date ;
于 2012-07-18T17:48:33.277 に答える