在显示其他列的同时选择一列的最高值

时间:2020-03-02 19:48:03

标签: sql sql-server

我正在为娱乐/练习构建Pokemon Go数据数据库。我有一个名为Moveset的表,该表跟踪每个神奇宝贝的每个可能的moveset的强度。这是数据库相关部分的ERD: DB 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的动作。

2 个答案:

答案 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
相关问题