我正在为娱乐/练习构建Pokemon Go数据数据库。我有一个名为Moveset的表,该表跟踪每个神奇宝贝的每个可能的moveset的强度。这是数据库相关部分的ERD:
这是Moveset表中的某些数据的样子:
Pokemon FastMove ChargeMove MovesetType TotalDpt ShieldPressure
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------------- ----------------------
Charizard Air Slash Blast Burn Community Day 11.52 7.2
Charizard Air Slash Dragon Claw NULL 7.89 10.3
Charizard Air Slash Fire Blast NULL 9.9 4.5
Charizard Air Slash Flamethrower Limited 9.49 6.5
Charizard Air Slash Overheat NULL 12.11 6.5
Charizard Air Slash Return Limited 9.17 5.1
Charizard Ember Dragon Claw Limited 7.89 10.3
Charizard Ember Fire Blast Limited 9.9 4.5
Charizard Ember Flamethrower Limited 9.49 6.5
Charizard Ember Overheat Limited 12.11 6.5
Charizard Ember Return Limited 9.17 5.1
Charizard Fire Spin Blast Burn Community Day 12.39 8
Charizard Fire Spin Dragon Claw NULL 8.36 11.4
Charizard Fire Spin Fire Blast NULL 10.59 5
Charizard Fire Spin Flamethrower Limited 10.14 7.3
Charizard Fire Spin Overheat NULL 13.05 7.3
Charizard Fire Spin Return Limited 9.78 5.7
Charizard Wing Attack Dragon Claw Limited 8 12
Charizard Wing Attack Fire Blast Limited 10.35 5.3
Charizard Wing Attack Flamethrower Limited 9.87 7.6
Charizard Wing Attack Overheat Limited 12.93 7.6
Charizard Wing Attack Return Limited 9.5 6
Venusaur Razor Leaf Frenzy Plant Community Day 11.93 5.3
Venusaur Razor Leaf Petal Blizzard NULL 10.66 3.7
Venusaur Razor Leaf Return Limited 10.31 3.4
Venusaur Razor Leaf Sludge Bomb NULL 10.44 4.8
Venusaur Razor Leaf Solar Beam NULL 11.1 3
Venusaur Vine Whip Frenzy Plant Community Day 13.67 10.7
Venusaur Vine Whip Petal Blizzard NULL 11.12 7.4
Venusaur Vine Whip Return Limited 10.43 6.9
Venusaur Vine Whip Sludge Bomb NULL 10.68 9.6
Venusaur Vine Whip Solar Beam NULL 12 6
我正在尝试编写一个查询,该查询将仅返回每个Pokemon的最高DPT移动集,但显示所有其他数据。因此,使用上面的示例数据,我想要的输出将如下所示:
Pokemon FastMove ChargeMove MovesetType TotalDpt ShieldPressure
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------------- ----------------------
Venusaur Vine Whip Frenzy Plant Community Day 13.67 10.7
Charizard Fire Spin Overheat NULL 13.05 7.3
我尝试在查询中使用MAX(TotalDPT),但随后我必须对要显示的所有其他字段进行分组,否则它将无法工作。例如,我尝试过:
Select Pokemon, FastMove, ChargeMove, MovesetType, MAX(TotalDpt), ShieldPressure
From Moveset
Group by Pokemon
但是,出现以下错误:
选择列表中的'Moveset.FastMove'列无效,因为它是 既不包含在聚合函数中,也不包含在GROUP BY子句中。
然后我尝试将列添加到Group By子句:
Select Pokemon, FastMove, ChargeMove, MovesetType, MAX(TotalDpt), ShieldPressure
From Moveset
Group by Pokemon, FastMove, ChargeMove, MovesetType, ShieldPressure
Order By MAX(TotalDPT) desc
但是,这仅输出表中的所有行。然后我尝试了这个:
Select Pokemon, MovesetType, MAX(TotalDpt)
From Moveset
Group by Pokemon
Order By MAX(TotalDPT) desc
这给了我每个口袋妖怪最高的TotalDPT,但没有告诉我他们正在使用哪种移动设定。我最需要知道的是赋予TotalDPT的动作。
答案 0 :(得分:2)
SQL Server中的最简单解决方案是:
Select top (1) with ties Pokemon, FastMove, ChargeMove, MovesetType, MAX(TotalDpt), ShieldPressure
From Moveset
order by row_number() over (partition by Pokemon order by TotalDPT desc);
这比其他解决方案的性能稍差(例如,在子查询中使用row_number()
或相关查询)。
答案 1 :(得分:2)
这将获得每个口袋妖怪的最大伤害
SELECT *
FROM (
SELECT Pokemon, FastMove, ChargeMove, MovesetType, ShieldPressure, TotalDpt
, ROW_NUMBER() OVER(PARTITION BY Pokemon ORDER BY TotalDPT DESC) AS rn
FROM Moveset
) a
WHERE rn = 1