簡體   English   中英

Postgres:GROUP BY幾欄

[英]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

sql小提琴演示

你有一些問題,但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上有索引,以確保您沒有任何產品的重疊。

SQL擺弄上述解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM