按 return 另一个字段中最大值的正确名称分组

Group by return correct name for a max value in another field

抱歉问题标题不好,但我有以下示例数据:

Account ID     Name     Order Value
1122           John      2000
1122           Dave      1500

对于许多 000 个帐户(在我的学习示例中)。我想做的是按帐户 ID 分组到 return 每个帐户的最大订单价值, 但我也对谁为每个帐户 ID 下订单感兴趣。

我是这样做的:

SELECT Data.[Account ID], min(Data.Name), max(Data.[Order Value])

group by Data.[Account ID]

然而,这个 returns Dave(由于 min() 函数)反对订单值 2000,因为我希望看到 John 的名字。如何获取与每个帐户的最大订单价值关联的名称?

这是典型的每组前 1 题。光靠聚合是解决不了的

一个选项使用反left join:

select d.*
from [Data] d
left join [Data] d1 
    on  (d1.[Account ID] = d.[Account ID])
    and (d1.[Order Value] > d.[Order Value])
where d1.[Account ID] is null

这句话是:获取没有其他记录的记录,具有相同的帐户和更大的订单价值。

别想"group by"。想想"filter"。您想获得具有最大订单价值的完整行。

这是一种方法:

select t.*
from t
where t.order_value = (select max(t2.order_value)
                       from t as t2
                       where t2.account_id = t.account_id
                      );

您还可以在 where not exists 子句中使用相关子查询:

select d.* from data d
where not exists 
(
    select 1 from data t where
    t.[Account ID]  = d.[Account ID] and 
    t.[Order Value] > d.[Order Value]
)

注意:

  • t & d 是允许 Data 在同一查询中被引用两次的别名。
  • select 1纯粹是为了优化:我们不关心子查询returns是什么,只关心它有记录(或者在这种情况下,没有记录)。

或者,您可以使用当前方法计算最大值并将结果简单地连接到原始数据集,例如:

select d.* from data d inner join
(
    select t.[Account ID], max(t.[Order Value]) as mov
    from data t
    group by t.[Account ID]
) q on
d.[Account ID]  = q.[Account ID] and 
d.[Order Value] = q.mov