python-3.x 将限制3设置为具有大小写和左连接的SQL?

vi4fp9gy  于 2022-12-30  发布在  Python
关注(0)|答案(1)|浏览(128)

我有一个SQL代码可以检索曲棍球队的所有分数,我想设置Limit 3<= 3

my = cursor_test.execute('''SELECT Next.ClubHome,
                            CASE
                            WHEN Next.ClubHome = Result.ClubHome then Result.ScoreHome
                            WHEN Next.ClubHome = Result.ClubAway then Result.ScoreAway
                            END as score
                            FROM NextMatch Next
                            LEFT JOIN ResultMatch Result ON Next.ClubHome in (Result.ClubHome, Result.ClubAway)
                            ''')

for row in my.fetchall():
    print(row)

让我更好地解释这个问题:
1.在NextMatch表中观察下一场芝加哥纽约达拉斯曲棍球比赛:在ClubHome中提供

下一场比赛

| 俱乐部之家|俱乐部之路|锦标赛|
| - ------|- ------|- ------|
| 芝加哥|明尼苏达州|非霍奇金淋巴瘤|
| 纽约|洛杉矶|非霍奇金淋巴瘤|
| 达拉斯|拉斯维加斯黄金|非霍奇金淋巴瘤|
1.在ResultMatch表中,我想检索芝加哥、纽约和达拉斯的最后3个总分(ScoreHomeScoreAway)。
芝加哥:2人
芝加哥:0
芝加哥:1人
纽约:2人
纽约:3人
纽约:2人
达拉斯:4人
达拉斯:3人
达拉斯:1人

结果匹配

| 俱乐部之家|俱乐部之路|锦标赛|圆形|得分之家|得分|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 多伦多|芝加哥|非霍奇金淋巴瘤|八个|1个|第二章|
| 纽约|拉斯维加斯|非霍奇金淋巴瘤|八个|第二章|三个|
| 芝加哥|达拉斯|非霍奇金淋巴瘤|七|无|四个|
| 渥太华|纽约|非霍奇金淋巴瘤|七|三个|三个|
| 芝加哥|布法罗萨博|非霍奇金淋巴瘤|六个|1个|无|
| 拉斯维加斯|芝加哥|非霍奇金淋巴瘤|六个|四个|第二章|
| 纽约|达拉斯|非霍奇金淋巴瘤|五个|第二章|三个|
| 达拉斯|布法罗萨博|非霍奇金淋巴瘤|五个|1个|第二章|
以下代码可能对解决方案有用。但是,它仅检索最后3个Scorehome结果(而不是ScoreAway):

x = cursor2.execute('''SELECT ClubHome,
                       FROM (SELECT NextMatch.ClubHome, NextMatch.ClubAway, ResultMatch.ScoreHome,
                       ROW_NUMBER() OVER (PARTITION BY NextMatch.ClubHome ORDER BY ResultMatch.ScoreHome DESC) AS rn
                       FROM NextMatch
                       INNER JOIN ResultMatch ON NextMatch.ClubHome = ResultMatch.ClubHome) t
                       WHERE rn <= 3
                       ORDER BY ClubHome ASC''')

如何修改我的(第一段代码)并添加Limit 3<= 3,以获得我在输出示例中要求的结果?谢谢

cclgggtu

cclgggtu1#

如果只想在SQL中执行,而不想在Python中过滤结果,可以使用窗口函数ROW_NUMBER:

SELECT clubHome, score FROM (
SELECT Next.clubhome,
       CASE
         WHEN Next.ClubHome = Result.ClubHome then Result.ScoreHome
         WHEN Next.ClubHome = Result.ClubAway then Result.ScoreAway
       END as score, 
       ROW_NUMBER() OVER (PARTITION BY next.clubHome ORDER BY round DESC) rowNum
  FROM nextmatch Next
  JOIN resultmatch Result ON Next.clubhome in (Result.clubhome, Result.clubaway)
) WHERE rowNum <= 3;

SQL小键盘:https://www.db-fiddle.com/f/xrLpLwSu783AQHrwD8Fq4t/0

相关问题