繁体   English   中英

在SQL中使用'rank'返回'top'行

[英]Using a 'rank' to return 'top' row in SQL

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

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,因此需要尽可能多的帮助!

在此先感谢(我找不到解决此问题的任何方法)

尼基

;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

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

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

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

SELECT
TOP 1 
* 
FROM haircuts 
ORDER BY service_rank

如果要使所有行具有最高的服务等级,则:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM