SQL возвращает наибольшую сумму строк - PullRequest
0 голосов
/ 03 апреля 2012

Я рассчитываю рассчитать самую высокую корзину в моем наборе данных, но не могу понять, как мне это сделать.

У меня есть данные как:

OrderID | CustomerID | BasketID | ProductID | Price

1 | 1 | 1 | 221 | 10
2 | 1 | 1 | 431 | 123
3 | 1 | 2 | 761 | 44
4 | 2 | 3 | 12 | 54
5 | 2 | 3 | 102 | 78
6 | 3 | 4 | 111 | 98
7 | 3 | 4 | 41 | 45
8 | 3 | 5 | 65 | 66
9 | 4 | 6 | 32 | 47
10 | 4 | 6 | 118 | 544

Извините, если это кажется довольно грязным.

Но я легко могу получить СУММУ с очевидным

SELECT SUM([Price]), BasketID, CustomerID FROM table
GROUP BY BasketID, CustomerID

Но как мне отфильтровать список только для идентификатора корзины по самой высокой цене для этого CustomerID

Спасибо

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Вы можете использовать CTE (Common Table Expression) с функцией ROW_NUMBER:

;WITH HighestPricePerCustomerAndBasket AS
(
   SELECT 
       ID, UserID, ClassID, SchoolID, Created,
       ROW_NUMBER() OVER(PARTITION BY BasketID,CustomerID ORDER BY Price DESC) AS 'RowNum'
   FROM dbo.YourTable
)
SELECT 
   [Price], BasketID, CustomerID
FROM HighestPricePerCustomerAndBasket
WHERE RowNum = 1

Этот CTE "разбивает" ваши данные на BasketID,CustomerID, а для каждого раздела ROW_NUMBERФункция выдает последовательные числа, начиная с 1 и упорядочивая по Price DESC - поэтому первая строка (самая высокая цена) получает RowNum = 1 (для каждого BasketID,CustomerID "раздела"), что я выбираю из CTE в операторе SELECTпосле него.

0 голосов
/ 03 апреля 2012
SELECT *
FROM   (SELECT *,
               DENSE_RANK() OVER (PARTITION BY CustomerID ORDER BY BasketTotal DESC) AS RNK
        FROM   (SELECT Sum(Price) AS BasketTotal,
                       BasketID,
                       CustomerID
                FROM   Order a
                GROUP  BY BasketID,
                          CustomerID
                          ) a

       ) b
       WHERE RNK = 1

Мне удалось создать что-то, что сработало.

...