SQL - 如何按ID分组并识别具有最高值的列?

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)

我怎样才能有效地实现这一目标?

Joh*_*Woo 2

既然您已经标记了SQL Server,请使用Common Table ExpressionWindow 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)