【问题标题】:SELECT defined value based on GROUPBY of DISTINCT columns SQLSELECT 基于 DISTINCT 列 SQL 的 GROUPBY 定义的值
【发布时间】: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 wonlegs lost 列中的值找到。 我知道最后的分数等于

MAX(legs won) and MAX(legs lost)

但是,以上需要再次按playeropponentdatecompetitionround 分组。如何将其包含在我的查询中?请指教!谢谢

期望的输出:

                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 ExampleSELECT * WHERE 不是有效的 SQL。
  • 为什么使用 ROW_NUMBER() 来获取唯一匹配项?一个带有 SELECT DISTINCT ... 的简单查询就足够了。另外,你的意思是 MAX(legs_won) - MAX(legs_lost) 的最终得分?发布样本数据和预期结果以澄清。
  • 我编辑了这个问题,希望现在能更好地描述我的问题。我应该更好地指定数据。
  • 理想情况下,您应该提供与您想要的结果相对应的样本数据,否则任何人都无法实际使用任何东西来测试有效的解决方案。

标签: mysql sql


【解决方案1】:

如果没有样本数据无法确定,但您似乎想要汇总。

SELECT player, opponent, date, competition, round
, MAX(`legs won`) AS max_legs_won
, MAX(`legs lost`) AS max_legs_lost
FROM darts
WHERE player LIKE '{player}' 
  AND opponent LIKE '{opponent}'
GROUP BY player, opponent, date, competition, round 
ORDER BY player, opponent, date, competition, round

【讨论】:

    猜你喜欢
    • 2018-02-08
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多