我有两个表共享一个公共密钥'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次之间更改价格,我想要一个查询返回以下数据集
itemID Price change from 4th Jan
--------------------------
item1 130 (i.e. 400-270)
item2 15
item3 23
运行mysql Ver 14.14 Distrib 5.5.29,for Linux(x86_64)
答案 0 :(得分: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
显然,由于您的日期没有以机器友好的方式格式化,这只会为您提供明确日期的价格,您需要对其进行修改以使用您的数据和甚至可能更改您的日期数据遵循更标准的日期格式。
答案 1 :(得分:0)
试试这个
select t1.itemID, (max(NewPrice)-min(NewPrice)) As PRICE
from tPriceHistory t1
group by t1.itemID
order by t1.itemID
答案 2 :(得分: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
答案 3 :(得分: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
更长,也可能会变慢,但我认为这个想法很好。)
请参阅this fiddle。