【发布时间】:2022-01-25 10:45:42
【问题描述】:
我有一个名为darts 的表,如下所示:
CREATE TABLE "darts" (
"player" TEXT,
"opponent" TEXT,
"date" TEXT,
"competition" TEXT,
"round" TEXT,
"sets" REAL,
"sets won" REAL,
"sets lost" REAL,
"legs" INTEGER,
"legs won" INTEGER,
"legs lost" INTEGER,
"opponent score" INTEGER,
"score_begin_of_turn" INTEGER,
"score_after_first_dart" INTEGER,
"score_after_second_dart" TEXT,
"score_after_third_dart" TEXT
);
db的每一行代表一个回合的玩家和相应的回合得分。两位玩家都以 0 局和 0 局获胜,得分为 501 开始。虽然数据代表比赛的时间序列,但我想检索每场比赛的“摘要”。 在 howie 的answer 的帮助下,我编写了以下查询
player = 'michael van gerwen'
opponent = 'gerwyn price'
query = f""" WITH DEDUPE AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY player, opponent, date, competition, round
ORDER BY player, opponent, date, competition, round) AS OCCURENCE
FROM darts)
SELECT *
WHERE OCCURENCE = 1
AND player LIKE '{player}'
AND opponent LIKE '{opponent}' """
此查询生成两个玩家在每个日期、锦标赛和回合中的所有唯一匹配。输出如下:
player opponent ... OCCURENCE
0 Michael van Gerwen Gerwyn Price ... 1
1 Michael van Gerwen Gerwyn Price ... 1
2 Michael van Gerwen Gerwyn Price ... 1
3 Michael van Gerwen Gerwyn Price ... 1
4 Michael van Gerwen Gerwyn Price ... 1
5 Michael van Gerwen Gerwyn Price ... 1
etc
但是,我还想确定最终得分。这可以通过使用legs won 和legs lost 列中的值找到。
我知道最后的分数等于
MAX(legs won) and MAX(legs lost)
但是,以上需要再次按player、opponent、date、competition 和round 分组。如何将其包含在我的查询中?请指教!谢谢
期望的输出:
player opponent ... legs_player legs_opponent
0 Michael van Gerwen Gerwyn Price ... 7 5
1 Michael van Gerwen Gerwyn Price ... 4 3
2 Michael van Gerwen Gerwyn Price ... 2 7
3 Michael van Gerwen Gerwyn Price ... 5 6
4 Michael van Gerwen Gerwyn Price ... 4 0
5 Michael van Gerwen Gerwyn Price ... 0 4
etc
【问题讨论】:
-
一个问题应该是独立的,即不需要参考其他问题来理解。示例数据和所需结果将有所帮助,请参阅如何提供Minimal, Reproducible Example。
SELECT * WHERE不是有效的 SQL。 -
为什么使用 ROW_NUMBER() 来获取唯一匹配项?一个带有 SELECT DISTINCT ... 的简单查询就足够了。另外,你的意思是 MAX(legs_won) - MAX(legs_lost) 的最终得分?发布样本数据和预期结果以澄清。
-
我编辑了这个问题,希望现在能更好地描述我的问题。我应该更好地指定数据。
-
理想情况下,您应该提供与您想要的结果相对应的样本数据,否则任何人都无法实际使用任何东西来测试有效的解决方案。