2016-01-20 18 views
0

在SQL創建新表會同組假設某個表的結構如下通過表循環由Postgres的

product | day | transactionid | saleprice | 
------------------------------------------------ | 
Apple | 1 | 239849248  | 10  | 
Apple | 2 | 239834328  | 10  | 
Apple | 2 | 239849249  | 10  | 
Apple | 3 | 239849234  | 11  | 
Banana | 1 | 239843244  | 2  | 
Banana | 2 | 239843244  | 2  | 
Banana | 3 | 239843244  | 3  | 
Banana | 4 | 239843244  | 3  | 
Orange | 1 | 239234238  | 25  | 
Orange | 2 | 239234238  | 25  | 
Orange | 3 | 239234238  | 25  | 
Orange | 3 | 239234238  | 26  | 
Orange | 3 | 239234238  | 26  | 
Orange | 4 | 239234238  | 27  | 

其中多項產品被出售,每一天,以不同的價格多筆交易。對於每種產品,我都對Min(SalePrice)(更改日誌,因爲這在我的數據中很少發生變化)的更改日誌感興趣。下面的查詢給我,對特定產品(說Orange):

SELECT max(product), day, min(saleprice) 
    FROM tableabove 
    where product = 'Orange' 
    group by day 
    order by day asc; 

給我:

product | day | minsaleprice | 
Orange | 1 |  25  | 
Orange | 2 |  25  | 
Orange | 3 |  25  | 
Orange | 4 |  27  | 

所以,我有什麼,我需要爲我指定產品,但現在在路上我需要它。例如,對於橙色我只需要價格改變的日子(和第1天),這意味着它應該只有第2天和第4天的兩行。我也不知道如何迭代表中的所有產品生成如下所示的新表。

product | day | minsaleprice | 
Apple | 1 |  10  | 
Apple | 3 |  11  | 
Banana | 1 |  2  | 
Banana | 3 |  3  | 
Orange | 1 |  25  | 
Orange | 4 |  27  | 

任何幫助表示讚賞。謝謝。

回答

1

我覺得你只是想lag()

select t.* 
from (select t.*, 
      lag(saleprice) over (partition by product order by day) as prev_saleprice 
     from tableabove t 
    ) t 
where prev_saleprice is null pr prev_saleprice <> saleprice; 

編輯:

如果你只是想改變一天一天,然後同樣的想法時用一個額外的聚合:

select t.* 
from (select t.product, t.day, min(salesprice) as min_saleprice 
      lag(min(saleprice)) over (partition by product order by day) as prev_minsaleprice 
     from tableabove t 
     group by t.product, t.day 
    ) t 
where prev_minsaleprice is null pr prev_minsaleprice <> minsaleprice; 
+0

謝謝。我沒有看到'min()'函數應用於某個產品每天聚合多個事務的位置。 –

+0

@ste_kwr。 。 。這是因爲'min()'沒有被用於聚合。事實上,沒有任何東西被彙總。這只是選擇銷售價格變化的行,這似乎是問題中提到的願望。 –

+0

每天都有多次交易,有多種不同的銷售價格。這些銷售價格的'min()'變化將被跟蹤。 –

0

在Gordon Linoff的指導下,我能夠寫下如下查詢:

SELECT table2.* 
FROM (SELECT table1.*, lag(table1.minsaleprice) OVER(partition by product) as prev_price 
FROM (SELECT product, day, MIN(saleprice) as minsaleprice FROM tableabove 
GROUP BY day, product ORDER BY product, day) 
as table1) 
as table2 
WHERE prev_price IS null OR prev_fee <> minsaleprice