【问题标题】:Using a 'rank' to return 'top' row in SQL在 SQL 中使用“排名”返回“顶”行
【发布时间】:2015-10-12 10:20:24
【问题描述】:

我有一个返回客户端服务的数据集,如下表:

PERSON_ID   SERVICE_CATEGORY   SERVICE_RANK
1234        BLOW DRY           3  
1234        CUT AND COLOUR     2
1234        RESTYLE            1
4321        BLOW DRY           3
4321        CUT AND COLOUR     2
4321        FRINGE TRIM        1

(不知道为什么我使用理发,它实际上是敏感数据,我不能使用它本身)

所以我需要运行以上所有服务的报告,但我只希望它带回最高的 Service_Rank(假设是 1-10,其中 1 是最重要的)

这将带回最高的那一个,即使那是 3 级,但那将是我们最重要的类别。

在这种情况下,我希望它会返回

PERSON_ID   SERVICE_CATEGORY   SERVICE_RANK 
1234        RESTYLE            1
4321        FRINGE TRIM        1

我希望这是有道理的。目前它是一个视图,使用各种表来传递数据,理想情况下,这将构成我的 Select 语句的一部分。

不幸的是,我刚刚学习 SQL,因此需要尽可能多的帮助!

提前致谢(我找不到任何解决此问题的方法)

尼基

【问题讨论】:

  • 当您edit 添加适当的标签时,还请根据您的示例数据添加您的预期结果是什么
  • 对不起,戈登,我已经这样做了。
  • 再次抱歉,Damien,我现在已经这样做了。

标签: sql sql-server sql-server-2012 sql-view


【解决方案1】:
;WITH CTE as
(
  SELECT 
    PERSON_ID, SERVICE_CATEGORY, SERVICE_RANK, 
    row_number() over (partition by PERSON_ID order by SERVICE_RANK) rn
  FROM
    yourtable
)
SELECT 
  PERSON_ID, SERVICE_CATEGORY, SERVICE_RANK
FROM CTE
WHERE rn = 1

【讨论】:

    【解决方案2】:

    假设您使用的是 MSSQL,并且只想要一行:

    SELECT
    TOP 1 
    * 
    FROM haircuts 
    ORDER BY service_rank
    

    如果您想要所有服务等级最高的行,那么:

    SELECT * 
    FROM haircuts 
    WHERE service_rank = 
    ( SELECT MIN(service_rank) from haircuts);
    

    【讨论】:

      【解决方案3】:

      一种方法是使用子查询来获得最大排名

      select person_id, service_category, service_rank
      from your_table
      where service_rank = (select min(service_rank) from your_table)
      

      这将返回 SERVICE_RANK 为 1 的两行。

      另一种方法是使用窗口函数对行进行编号:

      select person_id, service_category, service_rank 
      from (
          select 
             person_id, service_category, service_rank, 
             rn = row_number() over (partition by person_id order by service_rank asc)
          from your_table
      ) a where rn = 1
      

      【讨论】:

      • 谢谢,是否可以像上面使用 MAX 一样让它返回 MIN?
      • @Nikki83 是的,如果您想要最低排名,只需将 max 更改为 min。
      • @Nikki83 我已经更新了查询,以便它获取排名为 1 的行。
      • 啊,它们听起来都很棒,我只是要运行查询看看!谢谢
      猜你喜欢
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多