[英]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.