一尘不染

用于选择首选Candy的高效SQL 2000查询

sql

(我希望我能提出一个更具描述性的标题…如果您可以命名我要询问的查询类型,则建议一个或编辑这篇文章)

数据库: SQL Server 2000

样本数据(假设有500,000行):

Name   Candy       PreferenceFactor
Jim    Chocolate   1.0
Brad   Lemon Drop   .9
Brad   Chocolate    .1
Chris  Chocolate    .5
Chris  Candy Cane   .5
499,995 more rows...

请注意,具有给定“名称”的行数是无限制的。

所需的查询结果:

Jim    Chocolate   1.0
Brad   Lemon Drop   .9
Chris  Chocolate    .5
~250,000 more rows...

(由于Chris对Candy Cane和Chocolate的偏爱相同,因此获得一致的结果就足够了)。

问题:
如何从数据中选择名称,糖果,其中每个结果行包含一个唯一的名称,以使所选的糖果对每个名称具有最高的PreferenceFactor。(首选快速有效的答案)。

表格上需要哪些索引?如果Name和Candy是另一个表的整数索引(除了需要一些连接),这会有所不同吗?


阅读 226

收藏
2021-03-08

共1个答案

一尘不染

select c.Name, max(c.Candy) as Candy, max(c.PreferenceFactor) as PreferenceFactor
from Candy c
inner join (
select Name, max(PreferenceFactor) as MaxPreferenceFactor
from Candy
group by Name
) cm on c.Name = cm.Name and c.PreferenceFactor = cm.MaxPreferenceFactor
group by c.Name
order by PreferenceFactor desc, Name

2021-03-08