我正在计算我的数据集中最高的篮子,但我无法理解我应该如何做到这一点。
我有以下数据:
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
对不起,如果它看起来很乱。
但是我可以很容易地用明显的
获得SUMSELECT SUM([Price]), BasketID, CustomerID FROM table
GROUP BY BasketID, CustomerID
但是,如何仅针对该CustomerID的最高价篮子ID过滤列表
由于
答案 0 :(得分:1)
您可以将CTE(公用表表达式)与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
“分区”),这是我在后面的SELECT语句中从CTE中选择的。
答案 1 :(得分:0)
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
我设法让人觉得有用了。