2015-04-02 30 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"