具有排名功能的案例陈述

时间:2017-08-22 22:16:08

标签: sql teradata ranking ranking-functions

您好寻求帮助排名。

我正在使用SQL与Teradata合作,我尝试按特定组排名列表,然后按年龄排序。

例如:我想按组排名,然后只对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

4 个答案:

答案 0 :(得分:8)

您可以使用partition by子句:

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

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

答案 1 :(得分:2)

您的代码仍然按所有年龄排名,CASE只是将高年龄排名替换为零。

将CASE移动到RANK中的另一个解决方案(除了@trincot's answer之外):

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

这也对所有年龄进行排名,但是高排序最后排序因此获得高排名,由外部CASE替换为零。

答案 2 :(得分:0)

我建议的是您的Group列的分区,然后是Age by Age

---------------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

答案 3 :(得分:0)

以下代码适用于MS SQL Server。感谢@Victor Hugo Terceros,提供示例代码。

comprandom