如果您只想要最后两轮(强调“两个”),有一个简单的技巧。这个技巧不会扩展到获得两个以上的记录,或者不是最后两个记录。要获取分区中的任意记录,您必须使用窗口函数,该函数涉及更多,并且仅在较新版本的主流数据库引擎中支持。
诀窍是在高尔夫球手 id 上将“stat”表与自身进行自相等连接。这样,您就可以获得高尔夫球手任意两轮的所有组合,包括同一轮的组合:
SELECT s1.round as s1_round, s2.round AS s2_round
FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
然后您排除(通过 WHERE 子句)具有相同轮次的组合,并确保这些组合始终是第一轮 > 第二轮。这意味着现在您拥有任何两轮高尔夫球手的所有组合,没有重复:
SELECT s1.round as s1_round, s2.round AS s2_round
FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round
请注意,如果您仅选择特定高尔夫球手的记录并在两个圆形列上排序 DESC,则顶行将是该高尔夫球手的最后两轮:
SELECT TOP 1 s1.round as s1_round, s2.round AS s2_round
FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round
ORDER BY s1.round DESC, s2.round DESC
TOP 1 是获取第一行的 SQL Server 术语。对于 MySQL,您需要使用LIMIT 1。对于其他数据库,使用数据库引擎的特殊方式。
但是,在这种情况下,您不能仅仅因为需要最后两轮 ALL 高尔夫球手就这样做。你必须做更多的连接:
SELECT id,
(SELECT MAX(s1.round) FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round AND s1.golfer_id = golfer.id) AS last_round,
(SELECT MAX(s2.round) FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round AND s1.golfer_id = golfer.id) AS second_to_last_round
FROM golfer
这将为您提供每位高尔夫球手的最后两轮(分两列)。
或者用两列临时设置加入高尔夫球桌也应该工作:
SELECT golfer.id, MAX(r.s1_round) AS last_round, MAX(r.s2_round) AS second_to_last_round
FROM golfer INNER JOIN
(
SELECT s1.golfer_id AS golfer_id, s1.round AS s1_round, s2.round AS s2_round
FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round
) r ON (r.golfer_id = golfer.id)
GROUP BY golfer.id
我把这个查询加入到巡回赛表中以获取 PGA 巡回赛的高尔夫球手,并将此查询加入到统计表中以获取最后两轮的分数,这只是一个简单的练习。