2017-08-22 28 views
1

您好,您正在寻找排名帮助。具有排名功能的案例说明

我正在与Teradata一起使用SQL,我试图按特定组排列列表,然后按年龄排列列表。

例如:我想组的排名则只有那些排名选定组下的是21岁以下。

但是,当我使用下面的查询时,似乎没有考虑到组中的成员,并且只有在它们符合case语句中的条件时才进行赋值。

select 
policy, 
age, 
case when age <'21' then '1'else '0' end as Under21, 
case when age <'21' then dense_rank() over (order by group, age desc) else '0' end as Rank_Under_21 
from Table 

enter image description here

回答

5

可以使用partition by条款:

dense_rank() over (partition by policy, case when age < 21 then 1 end 
        order by group, age desc) 

注意:如果age是一个数字字段(应该是),那么就不是一个字符串比较:省略引号。如果age是字符串类型,那么请注意与另一个字符串的比较将按字母顺序排列,因此'9'>'21'。

+0

谢谢@Trincot这是非常有用的,并帮助回答我的问题! – doraav

0

我的建议是你的集团列分区,然后通过排名年龄

---------------Test Table with data--------- 
declare @tbl table(age int, policy varchar(20)) 
insert into @tbl 
select 1, 'A' union 
select 12, 'A' union 
select 20, 'A' union 
select 19, 'B' union 
select 30, 'B' union 
select 11, 'B' union 
select 4, 'C' union 
select 14, 'C' union 
select 5, 'B' union 
select 16, 'D' 
---------------Main Query-------------------- 
select policy,age, 
'1' as Under21, 
rank() over (partition by policy order by age desc) as Rank_Under_21 
from @tbl 
where age <21 
union 
select policy,age, 
'0' as Under21, 
0 as Rank_Under_21 
from @tbl 
where age >=21 
order by policy asc,age desc 

Results in the image below

+0

谢谢维克多。我想要做的是统计有多少成员年龄小于21岁。如果他们确实有年龄低于21岁的排比排名他们。 – doraav

+0

我更新了我的查询,它会得到您期望的确切结果,您可以在图像中看到 –

0

下面的代码是MS SQL服务器。感谢@Victor Hugo Terceros,获取示例代码。

DECLARE @tbl TABLE 
    (
    age INT, 
    grp VARCHAR(20) 
) 

INSERT INTO @tbl 
SELECT 1, 
     'A' 
UNION 
SELECT 12, 
     'A' 
UNION 
SELECT 20, 
     'A' 
UNION 
SELECT 19, 
     'B' 
UNION 
SELECT 30, 
     'B' 
UNION 
SELECT 11, 
     'B' 
UNION 
SELECT 4, 
     'C' 
UNION 
SELECT 14, 
     'C' 
UNION 
SELECT 5, 
     'B' 
UNION 
SELECT 16, 
     'D' 

SELECT grp  AS Policy, 
     age, 
     under21 AS Under21, 
     CASE 
     WHEN under21 = 0 THEN Dense_rank() 
           OVER(
            partition BY grp 
            ORDER BY under21age DESC) 
     ELSE 0 
     END  AS Rank_Under_21 
FROM (SELECT CASE 
       WHEN age < 21 THEN 0 
       ELSE 1 
       END AS Under21, 
       CASE 
       WHEN age < 21 THEN age 
       ELSE 0 
       END AS under21age, 
       age, 
       grp 
     FROM @tbl) AS t 
+0

Thanks @Victor。 我有一个表与不同的组,与该组相关的年龄。我试图通过基团的那些行,其中年龄评级小于21. 例如: A组 - 63等级:0 A组 - 54等级:0 A组 - 19等级:1 组A - 18等级:2 B组 - 65等级:0 B组 - 50等级:0 B组 - 19等级:0 B组 - 8等级:1 我想你的建议和它的作品不同的是,似乎它仅在符合case语句条件时才进行排序,并且看起来是针对所选组列出的行号。 – doraav

+0

您可以编辑您的问题并提供所需的结果集。 –

1

您的代码仍然排在所有年龄段,CASE只是用零代替高年龄段。

另一种解决方案(除了以@trincot's answer)的移动CASE到RANK:

CASE 
    WHEN age < 21 
    THEN Rank() 
     Over (PARTITION BY policy 
       ORDER BY CASE WHEN age < 21 THEN age END DESC) 
    ELSE 0 
END 

这也居所有年龄段,但高的人进行排序从而最后UND得到了很高的排名,其被替换外部CASE为零。

+0

感谢您的帮助,这似乎最适合我所需要的。欣赏它。 – doraav