如何获取产品今天和昨天价格的差异,并找出产品昨天是不是有货?
Posted
技术标签:
【中文标题】如何获取产品今天和昨天价格的差异,并找出产品昨天是不是有货?【英文标题】:How to get difference of price of today and yesterday price for a product and also find out whether product was available yesterday or not?如何获取产品今天和昨天价格的差异,并找出产品昨天是否有货? 【发布时间】:2015-02-16 08:15:23 【问题描述】:我在 AmazonRedshift (Postgresql) 中有一个表“price_hist”,其中包含 10 个国家/地区的产品和价格数据,每天两次。我只想要每种产品每天的最新数据
例如下面是表格
Country Product Price(string) Created_On
US 001 $2,300 2015/02/16 00:46:20
US 001 $2,300 2015/02/16 13:27:12
DK 006 kr1,700 2015/02/16 00:46:20
DK 006 kr1,700 2015/02/16 13:27:12
US 002 $5,300 2015/02/15 00:46:20
US 002 $5,300 2015/02/15 13:27:12
US 001 $2,200 2015/02/15 00:46:20
US 001 $2,200 2015/02/15 13:27:12
DK 007 kr28 2015/02/15 00:46:20
DK 007 kr28 2015/02/15 13:27:12
US 001 $2,100 2015/02/14 00:46:20
US 002 $5,200 2015/02/14 13:27:12
DK 007 kr9,100 2015/02/14 00:46:20
DK 007 kr9,100 2015/02/14 13:27:12
现在我想要一个查询,它应该始终显示今天和昨天的数据以及价格差异和产品标志,无论它是否昨天可用。 所需输出:
Country Product P_today p_yesterday p_change flag created_on
US 001 2300 2200 100 Both 2015/02/16 13:27:12
US 002 0 5300 -5300 Removed 2015/02/15 13:27:12
DK 006 1700 0 1700 Added 2015/02/16 13:27:12
DK 007 0 9100 -9100 Removed 2015/02/15 13:27:12
列 P_Change - 显示今天和昨天产品之间的价格变化。 标志 - 创建一列以反映今天数据中添加的新产品和已删除的产品。
【问题讨论】:
您可以将货币面额与货币价值分开存储吗? 你说你有 AmazonRedshift (Postgresql),那为什么要标记 mysql? @Strawberry 数据仅在带有货币和千位分隔符的表中,如果仅适用于美国,我可以使用 SUBSRTING 功能处理它,但我不知道如何为其他国家/地区做好吧。 这个数据模型让这个问题变得非常困难。 @Strawberry 是的,这确实会非常困难,无论如何现在都会从列中删除货币。 【参考方案1】:你可以这样做:
select country,product,P_today,P_yesterday, (P_today - P_yesterday) as P_change ,
CASE
WHEN P_today > 0 and P_yesterday > 0 then 'both'
WHEN P_today = 0 and P_yesterday > 0 then 'removed'
WHEN P_today > 0 and P_yesterday = 0 then 'added'
END
from
(select
isnull(q1.country,q2.country) as country,isnull(q1.product, q2.product) as product ,isnull(q1.price, 0) as P_today, isnull(q2.price,0) as P_yesterday
from
(select * from product where created_on in (select max(created_on) from product where date_trunc('day', created_on) = '2015-02-16 00:00:00+00' group by product,country)) as q1
full outer join
(select * from product where created_on in (select max(created_on) from product where date_trunc('day', created_on) = '2015-02-15 00:00:00+00' group by product,country)) as q2
on q1.country = q2.country and q1.product = q2.product )
我对其进行了测试,它给了我一些类似于您正在寻找的东西,见下文:
country | product | p_today | p_yesterday | p_change | case
---------+---------+---------+-------------+----------+---------
US | 001 | 2300 | 2300 | 0 | both
US | 002 | 0 | 2300 | -2300 | removed
DK | 006 | 700 | 0 | 700 | added
DK | 007 | 0 | 2300 | -2300 | removed
希望对您有所帮助。
【讨论】:
日期仍然是硬编码的,但如果你将它作为参数传递,它应该很容易动态传递。以上是关于如何获取产品今天和昨天价格的差异,并找出产品昨天是不是有货?的主要内容,如果未能解决你的问题,请参考以下文章