到目前为止,我有一份本赛季打进大满贯的球员名单。

___________________________________________________
| Player Name | dateOfGrandSlam | distance | home |
---------------------------------------------------
|  Griffin    |    9-14-2013   |    413   | true |
|  Griffin    |    10-1-2013   |    371   | false|
|  Simpson    |    5-15-2013   |    413   | true |
|   Reid      |    7-1-2013    |    362   | true |
|   Reid      |    7-4-2013    |    363   | true |
|   Reid      |    9-28-2013   |    388   | true |
|  Peavis     |    8-14-2013   |    466   | false|

我想要一份球员名单,他们最近的孙子在家。如果他们最近的孙子不在家,我不希望他们出现在我的名单上。
这意味着,我需要选择玩家并按玩家分组,然后从该组中选择最大日期。在这个列表中,我还必须包括家庭/客场信息,这样我才能找出那些不在家的。
但是我有个问题。因为为了选择属性home,我还需要在home子句中包含GROUP BY
例如:
SELECT playerName, MAX(date), distance, home
FROM grandslams
GROUP BY playerName, distance, home

问题是,这将返回一个表,其中包含最近的家和最近的客场孙子。
| Player Name | dateOfGrandSlam | distance | home |
---------------------------------------------------
|  Griffin    |    9-14-2013   |    413   | true |
|  Griffin    |    10-1-2013   |    371   | false|
|  Simpson    |    5-15-2013   |    413   | true |
|   Reid      |    9-28-2013   |    388   | true |

这不是我想要的-如果最近没有外孙,我只想要最近的外孙。
我想要这个结果:
___________________________________________________
| Player Name | dateOfGrandSlam | distance | home |
---------------------------------------------------
|  Simpson    |    5-15-2013   |    413   | true |
|   Reid      |    9-28-2013   |    388   | true |

本质上,我需要一种方法来执行查询,只需为每个玩家获取最近的孙子,附加home属性(不必按它分组,这样我就不会得到他最近的家和最近的客场),然后可以在外部查询中轻松筛选。
换句话说,我需要从
SELECT playerName, MAX(date), distance
FROM grandSlams
GROUP BY playerName, distance

并将home属性附加到它。

最佳答案

您可以通过使用row_number()函数枚举每个玩家的大满贯,并按日期降序排列,找到每个玩家最近的大满贯。要选择最近的,请选择值为1的值。再加上大满贯的主场条件:

select gs.*
from (select gs.*,
             row_number() over (partition by PlayerName
                                order by dateOfGrandSlam desc) as seqnum
      from GrandSlams gs
     ) gs
where seqnum = 1 and home = true;

关于sql - 在SELECT中包括一个属性,而不必在GROUP BY中包括它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20614620/

10-10 13:23