[英]Postgres: GROUP BY several column
我在這個例子中有兩個表。
(示例列名稱)
首先是產品
product_id | product_text
第二個表是Price。
price_productid | price_datestart | price_price
我們只想說我有同一產品的多個日期啟動。 我怎樣才能得到實際價格?
如果我在Postgres中使用GROUP BY,並且所有選定列都可以使用同一產品的2行。 因為列price_datestart是不同的。
示例:
product_id : 1
product_text : "Apple Iphone"
price_productid : 1
price_datestart :"2013-10-01"
price_price :"99"
price_productid : 1
price_datestart :"2013-12-01"
price_price :"75"
如果我試試這個:
SELECT price_productid,price_datestart,price_price,product_text,product_id
WHERE price_datestart > now()
GROUP BY price_productid,price_datestart,price_price,product_text,product_id
ORDER BY price_datestart ASC
它會給我一個結果,但是兩行我需要一個。
distinct on
語法distinct on
使用distinct on
。 如果您想要當前價格:
select distinct on (p.productid)
p.productid, pr.product_text, p.price, p.datestart
from Price as p
left outer join Product as pr on pr.productid = p.productid
where p.datestart <= now()
order by p.productid, p.datestart desc
你有一些問題,但GROUP BY不是其中之一。
首先,雖然您有一個日期啟動,但您沒有日期。 我將datestart更改為日期范圍,例如:
CREATE TABLE product
(
product_id int
,product_text text
);
CREATE TABLE price
(
price_productid int
,price_daterange TSRANGE
,price_price NUMERIC(10,2)
);
TSRANGE
允許您在給定范圍內設置價格的有效性,例如:
INSERT INTO product VALUES(1, 'phone');
INSERT INTO price VALUES(1, '[2013-08-01 00:00:00,2013-10-01 00:00:00)', 199);
INSERT INTO price VALUES(1, '[2013-10-01 00:00:00,2013-12-01 00:00:00)', 99);
INSERT INTO price VALUES(1, '[2013-12-01 00:00:00,)', 75);
這使得SELECT
變得更加簡單,例如:
SELECT price_productid,price_daterange,price_price,product_text,product_id
FROM product, price
WHERE price_daterange @> now()::timestamp
AND product_id = price_productid
這也有一個好處,允許您通過將now()
換成另一個日期來查詢任意時間。
你應該閱讀PostgresQL中的范圍,因為它們非常強大。 上面的示例並不完整,因為它還應該在price_daterange
上有索引,以確保您沒有任何產品的重疊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.