2013-06-03 4 views
2

Проблема, с которой я столкнулся, связана с Postgres, поскольку использование SUM с неистинными значениями или «продажами» приводит к неистовым суммарным суммам или «текущим продажам».Как получить отдельные суммы при суммировании по повторяющимся значениям?

Вот запрос:

SELECT *, 
     SUM(Sales) OVER (ORDER BY sales DESC) as running_sales 
FROM t; 

Here is the output

По существу я хочу эту таблицу следующим образом:

 
4--Motherboards------- 22----399 
5--RAID Controllers----22----421 

Кто-нибудь есть какие-либо идеи о том, как я могу это сделать?

стороне: Если кому-то интересно, это то, что я был following

ответ

3

Сделать заказ в предложении OVER уникальным путем добавления id в качестве второго ORDER BY пункта:

SELECT *, 
     SUM(Sales) OVER (ORDER BY sales DESC, id) as running_sales 
FROM t 
ORDER BY sales DESC, id; 

так, как вы имели его, равные продажи рассматриваются как равные в одном FRAME и суммируются сразу.
tutorial you were following не подходит для данного конкретного вопроса.

Также вы можете добавить ORDER BY к самому запросу, чтобы получить стабильные результаты. Это очень дешево, так как оно согласуется с порядком сортировки функции окна.

Как это реализовано прямо сейчас, вы обычно получаете результаты этого запроса в порядке функции окна для простых запросов, потому что это самый дешевый способ. Но Postgres не дает никаких гарантий относительно упорядочения строк без ORDER BY, произвольный заказ может меняться без предупреждения.

+0

Отлично, именно то, что мне нужно. Спасибо! – rennatnart

+0

@ user2449623: Рассмотрите дополнительную информацию о 'ORDER BY'. –