Sql 如何按产品获得不同的价格,每种产品只有一行

Sql 如何按产品获得不同的价格,每种产品只有一行,sql,postgresql,distinct,aggregate-functions,string-aggregation,Sql,Postgresql,Distinct,Aggregate Functions,String Aggregation,订单包含不同价格的相同产品 如何按顺序获得每个产品的不同价格列表,每个产品一行 我试过了 SELECT product, string_AGG(DISTINCT price::text, ',' ORDER BY price) FROM (VALUES ('A', 100), ('A', 200) , ('B', 200)) orderdetail (product, price) GROUP BY product 但是有错误 ERROR: in an aggregate with DIS

订单包含不同价格的相同产品

如何按顺序获得每个产品的不同价格列表,每个产品一行

我试过了

SELECT product, string_AGG(DISTINCT price::text, ',' ORDER BY price)
 FROM (VALUES ('A', 100), ('A', 200) , ('B', 200))
orderdetail (product, price)
GROUP BY product
但是有错误

ERROR:  in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
LINE 1: ...ct, string_AGG(DISTINCT price::text, ',' ORDER BY price DESC...
如何解决这个问题

使用Postgres 9.4

这可能是为创建答案所必需的

鉴于您的错误消息,以及@GordonLinoff等大师的建议,您不能在
字符串中使用
DISTINCT
。一个快速的解决方法是首先对表进行子查询,然后使用
DISTINCT
删除重复项

SELECT t.product, STRING_AGG(t.price::text, ',' ORDER BY price)
FROM
(
    SELECT DISTINCT product, price
    FROM (VALUES ('A', 100), ('A', 100), ('A', 200), ('B', 200), ('B', 200))
    orderdetail (product, price)
) t
GROUP BY t.product
我在Postgres上测试了这个查询,它返回以下结果:

product | string_agg
text    | text
A       | 100,200
B       | 200

price是orderdetail表中的第二列::text是postgres cast,它将其类型更改为text以获取字符串price list。在标准SQL中,它可能写为
cast(价格为文本)
当您说“如何按顺序获取每个产品的不同价格列表?”时,您的意思是每种产品一行吗?是的,每种产品一行包含按升序排列的不同价格列表。第二列也可以是数组而不是字符串谢谢,它可以工作。我希望这有一些本地语法。