按 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
抱歉问题标题不好,但我有以下示例数据:
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