【问题标题】:Using rank() with partition by, and order by case when将 rank() 与 partition by 和 order by case 一起使用
【发布时间】:2020-06-22 07:30:21
【问题描述】:

任务:

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

我尝试编写一个查询,该查询将为我对用户执行的订单类型进行排名。所以我需要为“相册”买 1 个,为“卡片”买 2 个,为他订购的其他东西买 3 个。

在我的 Excel 中,每个用户只有 1 个订单,这根本不是“相册”或“卡片”,因此应该为每个用户获取数字 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 个,尽管他们都没有相册。

【问题讨论】:

  • 样本数据和适当的数据库标签会有所帮助。

标签: sql rank partition case-when


【解决方案1】:

按用户分组并使用条件聚合:

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

【讨论】:

    【解决方案2】:

    我成功了!

    -- 如果用户有多个项目,则按以下顺序排列项目:1) 相册 2) 卡片 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
    group by f.USER_SK, d.PROJECT_TYPE
    order by f.USER_SK
    
    

    【讨论】:

      【解决方案3】:

      我认为你把事情复杂化了。您打算有 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
      

      【讨论】:

      • 如果我有 3 个项目供 1 个用户使用,这也会有帮助吗?我不认为:\
      【解决方案4】:

      听起来你根本不想要row_number()。我猜你每个用户只有一行。如果是这样:

         (case when d.PROJECT_TYPE = 'photobook' then 1                                                              
               when d.PROJECT_TYPE = 'card' then 2
                else 3
          end) as [rank]
      

      【讨论】:

      • 是的,你是对的,但如果我为每个用户有多个订单,我需要对每个用户的订单进行排名。这是任务:如果用户有多个项目,则按以下顺序排列项目:1)相册 2)卡片 3)任何其他项目类型
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多