3

在这个例子中我有两个表。

(示例列名)

首先是产品

product_id | product_text

第二张表是价格。

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

它会给我一个结果,但是两行,我需要一个。

4

2 回答 2

3

使用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 fiddle demo

于 2013-09-19T09:46:42.923 回答
0

您有一些问题,但 GROUP BY 不是其中之一。

首先,虽然你有一个 datestart,但你没有 dateend。我会将 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 摆弄上述解决方案

于 2013-09-19T09:55:45.740 回答