Rup*_*pal 7 sql sql-server group-by
我有一个SQL挑战,我需要一些帮助.
下面是一个简化的例子,在我的实际情况中,我在慢速VIEW中有大约500k行.因此,如果您有一个有效的解决方案,我将不胜感激.我想我必须以这种或那种方式使用GROUP BY,但我不确定.
假设我有一张这样的桌子
?????????????????????????????????????????
? ORDERID ? NAME ? TYPE ? PRICE ?
?????????????????????????????????????????
? 1 ? Broccoli ? Food ? 1 ?
? 1 ? Beer ? Beverage ? 5 ?
? 1 ? Coke ? Beverage ? 2 ?
? 2 ? Beef ? Food ? 2.5 ?
? 2 ? Juice ? Beverage ? 1.5 ?
? 3 ? Beer ? Beverage ? 5 ?
? 4 ? Tomato ? Food ? 1 ?
? 4 ? Apple ? Food ? 1 ?
? 4 ? Broccoli ? Food ? 1 ?
?????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
所以我想做的是:
在每个订单中,有两个食品和饮料订单行,我想要最高的饮料价格
所以在这个例子中我想有一个结果集:
???????????????????????????
? ORDERID ? NAME ? PRICE ?
???????????????????????????
? 1 ? Beer ? 5 ?
? 2 ? Juice ? 1.5 ?
???????????????????????????
Run Code Online (Sandbox Code Playgroud)
我怎样才能有效地实现这一目标?
既然您已经标记了SQL Server,请使用Common Table Expression和Window Functions。
;WITH filteredList
AS
(
SELECT OrderID
FROM tableName
WHERE Type IN ('Food','Beverage')
GROUP BY OrderID
HAVING COUNT(DISTINCT Type) = 2
),
greatestList
AS
(
SELECT a.OrderID, a.Name, a.Type, a.Price,
DENSE_RANK() OVER (PARTITION BY a.OrderID
ORDER BY a.Price DESC) rn
FROM tableName a
INNER JOIN filteredList b
ON a.OrderID = b.OrderID
WHERE a.Type = 'Beverage'
)
SELECT OrderID, Name, Type, Price
FROM greatestList
WHERE rn = 1
Run Code Online (Sandbox Code Playgroud)