Как получить разные цены по продуктам с одной строкой для каждого продукта

Заказ содержит один и тот же товар с разными ценами.

Как получить список различных цен на продукт по порядку, с одной строкой на продукт?

Я попытался

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.

Вероятно, это необходимо для создания ответа на Как найти измененный цены в последних двух счетах за покупку


person Andrus    schedule 04.10.2016    source источник
comment
price — второй столбец в таблице orderdetail. ::text — это postgres cast, который изменяет свой тип на text, чтобы получить строковый прайс-лист. Вероятно, это может быть написано как cast(price as text) в стандартном sql   -  person Andrus    schedule 04.10.2016
comment
Когда вы говорите «Как получить список различных цен для каждого продукта в порядке?», Вы имеете в виду одну строку для каждого продукта?   -  person Robin Mackenzie    schedule 04.10.2016
comment
Да, одна строка для каждого продукта, содержащая список различных цен в порядке возрастания. Второй столбец, вероятно, также может быть массивом вместо строки   -  person Andrus    schedule 04.10.2016


Ответы (1)


Учитывая ваше сообщение об ошибке и из то, что я прочитал здесь в Stack Overflow от гуру, таких как @GordonLinoff, вы не можете использовать DISTINCT внутри STRING_AGG. Быстрым обходным путем было бы просто сначала выполнить подзапрос к вашей таблице и использовать там 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
person Tim Biegeleisen    schedule 04.10.2016
comment
Спасибо, это работает. Я ожидал, что для этого есть какой-то родной синтаксис. - person Andrus; 04.10.2016