1

我有两个表共享一个公共键“itemID”,第一个表保存每个 itemID 的最新价格,第二个表保存 itemID 价格的任何更改的日期和值,如图所示。每当将新条目放入 tPriceHistory 表时,tLatestItemPrice 表就会自动更新

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

运行 mysql Ver 14.14 Distrib 5.5.29,适用于 Linux (x86_64)

4

4 回答 4

1

我强烈建议使用可由数据库排序的标准格式来格式化您的日期(正如@JW 所指出的那样)。

然后,您可以执行两个子选择以在给定日期获取两个不同的价格,然后在父查询中您可以对它们的价格执行减法运算。

像这样的东西(但这是一个混乱的快速想法!):

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 t1.itemID,   (max(NewPrice)-min(NewPrice)) As PRICE  
  from  tPriceHistory t1

  group by t1.itemID
  order by t1.itemID

这里演示 SQLFIDDLE

于 2013-01-03T14:32:54.153 回答
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 回答
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 回答