2015-04-02 77 views
1

我有一个表“产品”,我有一个明智的产品价格,现在我想知道哪些是昨天出现的产品,这些产品是昨天出现的,并且如果在两天中它们都存在,什么是价格变化的差异。如何加入同一张表来获得两天之间的价格差异?

例如表 “产品”:

locale  productID  price   date 
US   pro1    100   2015-04-02 
US   pro2    200   2015-04-02 
CA   pro1    100   2015-04-02 

US   pro1    110   2015-04-01 
US   pro3    500   2015-04-01 
CA   pro4    100   2015-04-01 

因此所需的输出应为: -

locale_t|productID_t|price_t|date_t|locale_y|productID_y|price_y|date_y|change 
US  pro1  100 2015-04-02 US pro1  110 2015-04-01 10 
US  pro2  200 2015-04-02  REMOVED      200 
     REMOVED      US pro3  500 2015-04-01 500 
CA  pro1  100 2015-04-02  REMOVED      100 
     REMOVED      CA pro4  100    100 

其中locale_t装置locale_today和locale_y装置locale_yesterday。 因此,我可以清楚地分辨出昨天有多少产品被删除,今天又添加了多少产品。

回答

1

你想要一个自交叉连接,但事实证明你真的加入了两个不同的子集。

为了实现这一点,一种方法是在相同的数据上连接两个子查询,例如, http://sqlfiddle.com/#!15/2d6ae/15

SELECT 
    coalesce(yesterday.locale, today.locale) AS locale, 
    coalesce(yesterday."productID", today."productID") AS "productID", 
    today.date AS date_t, 
    today.price AS price_t, 
    yesterday.date AS date_y, 
    yesterday.price AS price_y, 
    today.price - yesterday.price AS "change" 
FROM (
    SELECT * FROM Table1 WHERE "date" = '2015-04-01' 
) AS yesterday 
    FULL OUTER JOIN (
    SELECT * FROM Table1 WHERE "date" = '2015-04-02' 
) AS today 
    ON (today."locale" = yesterday."locale" 
     AND today."productID" = yesterday."productID") 
ORDER BY 1, 2; 

locale | productID | date_t | price_t | date_y | price_y | change 
--------+-----------+------------+---------+------------+---------+-------- 
CA  | pro1  | 2015-04-02 |  100 |   |   |  
CA  | pro4  |   |   | 2015-04-01 |  100 |  
US  | pro1  | 2015-04-02 |  100 | 2015-04-01 |  110 | -10 
US  | pro2  | 2015-04-02 |  200 |   |   |  
US  | pro3  |   |   | 2015-04-01 |  500 |  
(5 rows) 

预期的结果是不完全一样,但你没有真正使任何试图用言语来指定你想要什么,我不喜欢猜测。

我怀疑你可能会想使用​​3210在change列产生了空的结果,是这样的:

coalesce(today.price - yesterday.price, today.price, -yesterday.price) AS "change"