6

前の日付から最新の日付を使用して、MySQL で 2 つの行を減算する必要があります。

開始テーブル:

Stock       Date          Price
GOOG        2012-05-20    402
GOOG        2012-05-21    432
APPL        2012-05-20    553
APPL        2012-05-21    590
FB          2012-05-20     40
FB          2012-05-21     34

これは結果表です。

Stock       Date          Price Change
GOOG        2012-05-21    30
APPL        2012-05-21    37
FB          2012-05-21    -6

現在、会社ごとに 2 つの日付しかありませんが、クエリが任意の数の日付を処理できる場合は、ボーナスの賛成票を投じることができます。

4

2 に答える 2

4

私が行ったことは、各株の最高日と最低日を取得するために 2 つの個別のクエリを取得することでした。これを試して、

SELECT  maxList.stock, 
        maxList.Date,
        (maxlist.Price - minlist.Price) totalPrice
FROM
    (
        SELECT  a.*
        FROM    tableName a INNER JOIN
        (
            SELECT      Stock, MAX(date) maxDate
            FROM        tableName
            GROUP BY    Stock
        ) b ON  a.stock = b.stock AND
                a.date = b.maxDate
    ) maxList INNER JOIN
    (
        SELECT  a.*
        FROM    tableName a INNER JOIN
        (
            SELECT      Stock, MIN(date) minDate
            FROM        tableName
            GROUP BY    Stock
        ) b ON  a.stock = b.stock AND
                a.date = b.minDate
    ) minList ON maxList.stock = minList.stock

SQLFiddle デモ

更新 1

あなたの最後の文を見てください:Right now I just have two dates per company, but bonus upvotes if your query can handle any number of dates.このようなレコードがある場合はどうなりますか?

FB          2012-05-20     40
FB          2012-05-21     34
FB          2012-05-22     42

その結果はどうなるでしょうか。

ここに画像の説明を入力

于 2012-09-07T00:44:27.023 に答える
1

これはすでに回答されていることは知っていますが、この問題に興味を持ったので、試してみようと思いました。

連続する 2 つの日付の違いを見たいと思うかもしれません。

したがって、次のデータの場合:

GOOG        2012-09-07  42.34
GOOG        2012-09-06  44.56
GOOG        2012-09-01  44.32
FB          2012-09-07  17.82
FB          2012-08-05  12.98

あなたは得るでしょう:

GOOG        2012-09-07  2012-09-06  -2.22
GOOG        2012-09-06  2012-09-01  0.24
FB          2012-09-07  2012-08-05  4.84

このために私が書いたクエリは次のとおりです。

SELECT t1.Stock, t1.Date AS CurrentDate, oldDate.Date AS OldDate, (t1.Price - oldDate.Price) AS PriceChange
FROM MP_StockTable t1
JOIN (SELECT t2.Stock, t2.Date AS date1, (SELECT MAX(t3.Date) FROM MP_StockTable t3 WHERE t3.Date < t2.Date AND t3.Stock = t2.Stock GROUP BY t3.Stock) AS date2 
        FROM MP_StockTable t2) AS StockDates ON StockDates.Stock = t1.Stock AND StockDates.date1 = t1.Date
JOIN MP_StockTable oldDate ON oldDate.Stock = t1.Stock AND oldDate.Date = StockDates.date2 

インライン テーブルは基本的に、各行の直近の日付を計算します。したがって、上記のデータの場合、生成されたテーブルは次のようになります。

GOOG        2012-09-07  2012-09-06
GOOG        2012-09-06  2012-09-01
GOOG        2012-09-01  NULL
FB          2012-09-07  2012-08-05
FB          2012-08-05  NULL

次に、そのテーブルの 2 つの日付を使用して、2 つの価格ポイントを取得します。

注: SQLServer でテストしていたので、mySql の微調整が必​​要な場合は申し訳ありません (mySql を使用してから何年も経っているため、違いを忘れてしまいました)。

于 2012-09-07T15:10:16.233 に答える