如何获取产品今天和昨天价格的差异,并找出产品昨天是不是有货?

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

希望对您有所帮助。

【讨论】:

日期仍然是硬编码的,但如果你将它作为参数传递,它应该很容易动态传递。

以上是关于如何获取产品今天和昨天价格的差异,并找出产品昨天是不是有货?的主要内容,如果未能解决你的问题,请参考以下文章

js 获取昨天,今天和明天的年月日格式

js获取日期:昨天今天和明天后天

js获取日期:昨天今天和明天后天 [转贴记录]

如何使用 DateFormatter 显示昨天、今天和明天

Moment.js - 明天、今天和昨天

创始人 KK:Jenkins 的昨天今天和明天