Sql 将rank()与partition by和order by case一起使用时
任务: 如果用户有多个项目,则按以下顺序排列项目:1)照片簿2)卡片3)任何其他项目类型 我试图编写一个查询,为我排序用户的订单种类。所以我需要买1张“photobook”,2张“card”,3张他点的其他东西 在我的Excel中,每个用户只有一个订单,这根本不是“照片簿”或“卡片”,所以每个用户都应该得到数字3 这是我尝试的查询:Sql 将rank()与partition by和order by case一起使用时,sql,rank,partition,case-when,Sql,Rank,Partition,Case When,任务: 如果用户有多个项目,则按以下顺序排列项目:1)照片簿2)卡片3)任何其他项目类型 我试图编写一个查询,为我排序用户的订单种类。所以我需要买1张“photobook”,2张“card”,3张他点的其他东西 在我的Excel中,每个用户只有一个订单,这根本不是“照片簿”或“卡片”,所以每个用户都应该得到数字3 这是我尝试的查询: select f.USER_SK, rank() over (partition by f.user_sk
select f.USER_SK,
rank() over (partition by f.user_sk
order by case when d.PROJECT_TYPE='photobook' then 1 end,
case when d.PROJECT_TYPE='card' then 2 end,
case when d.project_type not in ('card','photobook') then 3 end
) as [rank]
from Project_f f inner join
project_d d
on f.PROJECT_SK=d.PROJECT_SK
我得到的结果是,每个用户1个,尽管他们中没有人买过photobook。听起来你根本不想要
行号()。我猜每个用户只有一行。如果是:
(case when d.PROJECT_TYPE = 'photobook' then 1
when d.PROJECT_TYPE = 'card' then 2
else 3
end) as [rank]
我觉得你把事情复杂化了。您是否打算有3个单独的案例陈述
select f.user_sk,
case
when d.PROJECT_TYPE='photobook' then 1
when d.PROJECT_TYPE='card' then 2
else 3 end as rank
from Project_f f inner join
project_d d
on f.PROJECT_SK=d.PROJECT_SK
order by rank
我成功了
--如果用户有多个项目,则按以下顺序排列项目:1)照片簿2)卡片3)任何其他项目类型--
按用户分组并使用条件聚合:
select f.USER_SK,
min(
case d.PROJECT_TYPE
when 'photobook' then 1
when 'card' then 2
else 3
end
) rn
from Project_f f inner join project_d d
on f.PROJECT_SK=d.PROJECT_SK
group by f.USER_SK
样本数据和适当的数据库标记会有所帮助。是的,你是对的,但如果我有多个订单给每个用户,我需要为每个用户的订单排序。这就是任务:如果用户有多个项目,则按以下顺序排列项目:1)照片簿2)卡片3)任何其他项目类型如果我有3个项目供一个用户使用,是否也会有所帮助?我不认为:\
select f.USER_SK,
min(
case d.PROJECT_TYPE
when 'photobook' then 1
when 'card' then 2
else 3
end
) rn
from Project_f f inner join project_d d
on f.PROJECT_SK=d.PROJECT_SK
group by f.USER_SK