Min Partition by with Case When

Min Partition by with Case When

我有一个 table,如下所示:

      col1     user        Product    Ranking_Output  
2019-11-30      123              A                 1  
2019-12-01      123              B                 2
2019-12-11      123              B                 3

对于 Product = 'B',如何找到用户的最小值 ranking_output

我尝试了如下所示的最小分区,但得到了以下结果:

CASE WHEN PRODUCT LIKE '%B%' THEN MIN(Ranking_Output) OVER (PARTITION BY User) ELSE 1 END MIN_DETECTOR

      col1     user        Product    Ranking_Output     Actual Output   
2019-11-30      123              A                 1                 1    
2019-12-01      123              B                 2                 1     
2019-12-11      123              B                 3                 1   

我想避免使用 "where" 子句,因为这是更大的 table 的一部分,并且希望输出如下所示:

      col1     user        Product    Ranking_Output     Desired Output
2019-11-30      123              A                 1           1
2019-12-01      123              B                 2           2
2019-12-11      123              B                 3           2

您似乎想要每行前非 B 值的总和。如果是:

(case when product like '%B%'
      then sum(case when product not like '%B%' then 1 else 0 end) over (partition by user order by col_1)
      else 1
 end)

(抱歉,没有注意到您正在使用的数据库。我使用 Oracle 工作。所以语法可能与您的不匹配。)

您遇到的问题是,分析不是 "honoring" 情况..也就是说..尽管情况如此,它仍会计算分析...然后根据您的情况显示分析结果案例.

[edit] 听起来不像我想要的那么清楚..让我们试试这个: 查询首先 计算 你的分析函数......然后它处理这种情况......所以分析函数使用所有行进行计算,但然后只显示 B 值你通缉。 [/编辑]

要让它更准确地计算出您想要的结果,请将产品包含在您的分区中:

  CASE WHEN PRODUCT LIKE '%B%' 
        THEN MIN(Ranking_Output) OVER (PARTITION BY cuser,product) 
     ELSE 1 
     END MIN_DETECTOR

所以这样:(仅供参考,我使用 "cuser" 作为列,因为 "user" 是保留字 ..)

  with w_data as (
        select '2019-11-30'  col1, 123  cuser, 'A'  product, 1  ranking_output from dual union all
        select '2019-12-01'  col1, 123  cuser, 'B'  product, 2  ranking_output from dual union all
        select '2019-12-11'  col1, 123  cuser, 'B'  product, 3  ranking_output from dual 
     )
  select col1, cuser, product, ranking_output,
        CASE WHEN PRODUCT LIKE '%B%' 
              THEN MIN(Ranking_Output) OVER (PARTITION BY cuser,product) 
           ELSE 1 
           END MIN_DETECTOR
  from w_data
  /

产生这个输出:

  COL1            CUSER P RANKING_OUTPUT MIN_DETECTOR
  ---------- ---------- - -------------- ------------
  2019-11-30        123 A              1            1
  2019-12-11        123 B              3            2
  2019-12-01        123 B              2            2

  3 rows selected.

PRODUCT 添加到您的 PARTITION BY

CASE
    WHEN PRODUCT LIKE '%B%'
        THEN MIN(Ranking_Output) OVER (PARTITION BY User, Product)
    ELSE 1
END MIN_DETECTOR