选择数据库中最年轻的三个玩家

时间:2018-02-21 09:46:58

标签: sql database postgresql

我目前正在学校学习SQL(postgresql),但我很难理解看起来像一个简单查询的东西。 练习是在不使用FETCHLIMIT的情况下让数据库中三个最年轻的玩家获得。这就是问题的答案:

SELECT playerid, name, birth_date
FROM players p1
WHERE 2>=
      (SELECT count(*)
       FROM players p2
       WHERE p2.birth_date > p1.birth_date);

这很好但我想知道的是为什么这会让3名最年轻的球员回归?

2 个答案:

答案 0 :(得分:1)

您可以使用row_number()窗口函数:

SELECT * FROM (
  SELECT playerid, name, birth_date, row_number() over (order by birth_date) rn
  FROM players p1 
) a WHERE rn <= 3

答案 1 :(得分:1)

where子句的子查询返回birth_date大于主查询返回的行的播放器数。因此,2&gt; =(子查询)仅过滤只有2个或更少年轻玩家的记录。

您可以将子查询放在select子句上以获取它返回的内容。

SELECT playerid, name, birth_date,     (SELECT count(*)
   FROM players p2
   WHERE p2.birth_date > p1.birth_date) youngers_count
FROM players p1
WHERE 2>=
  (SELECT count(*)
   FROM players p2
   WHERE p2.birth_date > p1.birth_date);