【问题标题】:How do I merge two columns into one? PostgreSQL如何将两列合并为一列? PostgreSQL
【发布时间】:2021-07-18 08:26:34
【问题描述】:

我为保龄球联赛运行了一个数据库,每周,我们都会进行 2 场保龄球比赛。游戏 1 的分数被放入 game1_score 列,游戏 2 的分数被放入 game2_score 列,我得到这样的输出:

表格名称:player_scores

season_id|nick_name         |g1_score|g2_score|
---------+------------------+--------+--------+
        2|Axel              |     133|     210|
        2|Benjie B          |      91|     163|
        2|Steveball         |     149|     159|
        2|Shadynasty        |     132|     157|
        2|MatT K            |     122|     151|

我正在寻找一种方法来找到最高分,无论是第 1 场还是第 2 场比赛。我的预期结果是:

season_id|nick_name         |high_game|
---------+------------------+--------+
        2|Axel              |     210|
        2|Benjie B          |     163|
        2|Steveball         |     159|
        2|Shadynasty        |     157|
        2|MatT K            |     151|
        2|Steveball         |     149|
        2|Axel              |     133|
        2|Shadynasty        |     132|
        2|MatT K            |     122|
        2|Benjie B          |      91|

到目前为止,我所能做的就是从第 1 场或第 2 场比赛中获得最大值,例如:

season_id|nick_name         |high_game|
---------+------------------+--------+
        2|Axel              |     210|
        2|Benjie B          |     163|
        2|Steveball         |     159|
        2|Shadynasty        |     157|
        2|MatT K            |     151|

有没有办法做到这一点,或者我应该将所有分数(无论是第 1 场还是第 2 场比赛)插入到同一列中?

我使用的是 PostgreSQL 13.3。

感谢您提供或即使尝试提供的任何帮助和见解。非常感谢!

【问题讨论】:

  • 你似乎不想要“高分”。您似乎希望所有分数都以降序排列。
  • 如果提供的答案解决了您的问题,请接受。这有助于将来有类似问题的用户。不要只将成功的问题留在未决状态。
  • 谢谢 Belayer,没有看到那个选项,只是标记了它!

标签: sql postgresql


【解决方案1】:

以下示例对我有用

with highscores as (
                select season_id, nickname, g1_score as high_game 
                from player_scores ps1
                union 
                select season_id, nickname, g2_score as high_game 
                from player_scores ps2
               )
select * from highscores order by high_game desc

【讨论】:

    【解决方案2】:

    您似乎想要取消透视数据并进行排序:

    select ps.nickname, v.score
    from player_scores ps cross join lateral
         (values (g1_score), (g2_score) ) v(score)
    order by v.score desc;
    

    【讨论】:

      【解决方案3】:

      您最好对数据进行规范化,结果是游戏在单个列中,另外一列指示特定游戏。但是,您可以使用当前结构获得所需的内容。不要选择(或另外)在 g1_score 和 g2_score 上使用 greatest 函数。

      select ps.season_id
           , ps.nick_name
           , ps.g1_score
           , ps.g2_score
           , greatest(ps.g1_score, ps.g2_score) high_game
      from player_scores ps 
      order by greatest(ps.g1_score, ps.g2_score) desc; 
      

      【讨论】:

        【解决方案4】:
        select nick_name, g1_score high_score 
        from score_players
        where season_id = 2
        union
        select nick_name, g2_score high_score 
        from score_players
        where season_id = 2
        order by high_score desc
        

        最终为我工作,谢谢大家的关注!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-14
          • 1970-01-01
          • 1970-01-01
          • 2014-10-02
          • 2013-01-23
          • 2011-10-23
          • 2014-05-09
          相关资源
          最近更新 更多