【问题标题】:Same column values in a partition as value in Rank 1 row分区中的列值与 Rank 1 行中的值相同
【发布时间】:2020-06-10 05:33:11
【问题描述】:

我希望我的 SQL 查询在分区中返回与分区中 Rank 1 行中同一列中的值相同的列值。

示例: 下面是一个示例表:

Rank  Name  Class  PocketMoney
----  ----  -----  -----------
1       A     6         6
2       B     6         5
3       C     6         4
1       P     7         7
2       Q     7         6
1       R     8         8
2       S     8         7
3       T     8         6
4       U     8         5

我希望我的 SQL 查询的输出类似于:

Rank  Name  Class  PocketMoney
----  ----  -----  -----------
1       A     6         6
2       B     6         6
3       C     6         6
1       P     7         7
2       Q     7         7
1       R     8         8
2       S     8         8
3       T     8         8
4       U     8         8

这在 SQL 查询中是否可行?

【问题讨论】:

  • 您是否使用 MySQL 8.x 以便可以使用窗口函数?
  • “示例”是表还是查询结果?将表类型示例替换为 CREATE TABLE + INSERT INTO 脚本(如果是查询输出,则为 SQL 查询)。 这在 SQL 查询中是否可行? 当然。
  • @Barmar - 是的,可以使用窗口函数
  • @Akina 示例中的第一个表是该表,第二个是我想要的 SQL 查询结果

标签: mysql sql


【解决方案1】:

是的,使用first_value 从分区的第一行获取值。

select
  rank() over w,
  name,
  class,
  first_value(PocketMoney) over w as pocketmoney
from whatever
window w as (partition by class order by name asc)

【讨论】:

    【解决方案2】:

    如果您特别想要与rank = 1 相同的值,请使用条件窗口函数:

    select t.*,
           max(case when rank = 1 then pocketmoney end) over (partition by class) as pocketmoney_1
    from t;
    

    注意:这是专门回答您的问题的通用解决方案。即使没有 rank = 1 或者排名小于 1,它也会执行您想要的操作。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多