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

时间:2015-07-22 13:40:42

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

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

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

提前致谢(我无法找到解决此问题的任何内容)

尼克

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

一种方法是使用子查询来获得最高等级

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

答案 2 :(得分:0)

假设您正在使用MSSQL并且只想要一行:

SELECT
TOP 1 
* 
FROM haircuts 
ORDER BY service_rank

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

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