Sql 将rank()与partition by和order by case一起使用时

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

任务:

如果用户有多个项目,则按以下顺序排列项目:1)照片簿2)卡片3)任何其他项目类型

我试图编写一个查询,为我排序用户的订单种类。所以我需要买1张“photobook”,2张“card”,3张他点的其他东西

在我的Excel中,每个用户只有一个订单,这根本不是“照片簿”或“卡片”,所以每个用户都应该得到数字3

这是我尝试的查询:

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