1

共通キー「itemID」を共有する 2 つのテーブルがあります。最初のテーブルには各 itemID の最新の価格が保持され、2 番目のテーブルには、表示されているように itemID 価格の変更の日付と値が保持されます。tLatestItemPrice テーブルは、新しいエントリが tPriceHistory テーブルに入力されるたびに自動的に更新されます。

tLatestItemPrice TABLE
itemID,   latestPrice
---------------------
item1     400
item2     75
item3     621


tPriceHistory TABLE
itemID,   PriceChangeDate,  NewPrice
------------------------------------
item1     Jan 8th 2012      400
item1     Jan 7th 2012      300
item1     Jan 6th 2012      280
item1     Jan 3rd 2012      270
item2     Jan 8th 2012      75
item2     Jan 5th 2012      72
item2     Jan 1st 2012      60
item3     Jan 7th 2012      621
item3     Jan 6th 2012      601
item3     Jan 2nd 2012      598

tLatestItemPrice テーブルの最新の価格と特定の日付の商品の価格との差額を返すクエリが必要です。つまり、最新の 1 月 4 日から 1 月 4 日までの価格の変更を求める場合、次のデータセットを返すクエリが必要です。

itemID    Price change from 4th Jan
--------------------------
item1     130  (i.e. 400-270)
item2      15
item3      23

Linux (x86_64) 用の mysql バージョン 14.14 Distrib 5.5.29 の実行

4

4 に答える 4

1

データベースでソート可能な標準形式を使用して日付をフォーマットすることを強くお勧めします(@JWが指摘したように)。

次に、2 つの副選択を実行して、指定された日付の 2 つの異なる価格を取得し、親クエリでそれらの価格の減算を実行できます。

このようなもの(しかし、これは厄介な簡単なアイデアです!):

select itemID, TO_P.NewPrice as currentPrice, (FROM_P.NewPrice - TO_P.NewPrice) as priceChange
from tPriceHistory as P 
left join (select itemID, PriceChangeDate, NewPrice from PRICES where PriceChangeDate = 'from_date') as FROM_P on FROM_P.itemID = P.itemID
left join (select itemID, PriceChangeDate, NewPrice from PRICES where PriceChangeDate = 'to_date') as TO_P on TO_P.itemID = P.itemID

明らかに、日付は機械に適した方法でフォーマットされていないため、明示的な日付の価格のみが表示されます。これを変更してデータを操作し、おそらくデータをより標準的な日付形式に変更する必要があります.

于 2013-01-03T14:24:07.613 に答える
0

私はこの方法で解決したかった:

select
  tLatestItemPrice.itemID,
  latestPrice-Substring_Index(prices, ',', -1)
from tLatestItemPrice inner join (
  select
    tPriceHistory.itemID,
    GROUP_CONCAT(NewPrice order by
       str_to_date(PriceChangeDate, '%b %D %Y')) as prices
  from tPriceHistory
  where str_to_date(PriceChangeDate, '%b %D %Y')<'2012-01-04'
  group by itemID ) mx
  on tLatestItemPrice.itemID=mx.itemID

price(文字列がより長くなり、遅くなる可能性があるため、これは常に最適であるとは限りませんがgroup_concat_max_len、アイデアは素晴らしいと思います)。

このフィドルを参照してください。

于 2013-01-03T14:49:13.213 に答える
0

これは、日付をテーブルに文字列として格納するとどうなるかです

SELECT  a.ITEMID, 
        d.NewPrice - a.NEWPRICE `Price change from 4th Jan`
FROM    tPriceHistory a
        INNER JOIN
        (
          SELECT itemID, 
                 DATE_FORMAT(MAX(STR_TO_DATE(PriceChangeDate, '%b %D %Y')),'%b %D %Y') maxDate
          FROM   tPriceHistory
          WHERE  STR_TO_DATE(PriceChangeDate, '%b %D %Y') <= '2012-01-04'
          GROUP BY itemID
        ) AsOfDatePrice ON a.itemID = AsOfDatePrice.ItemID AND
                           a.PriceChangeDate = AsOfDatePrice.MaxDate
        INNER JOIN 
        (
          SELECT itemID, 
                 DATE_FORMAT(MAX(STR_TO_DATE(PriceChangeDate, '%b %D %Y')),'%b %D %Y') maxDate
          FROM   tPriceHistory
          GROUP BY itemID 
        ) LatestDate ON a.itemID = LatestDate.itemid
        INNER JOIN tPriceHistory d
            ON LatestDate.itemid = d.itemID AND
               LatestDate.maxDate = d.PriceChangeDate
于 2013-01-03T14:39:40.283 に答える