代码之家  ›  专栏  ›  技术社区  ›  nak5120

按大小写的最小分区

  •  0
  • nak5120  · 技术社区  · 6 年前

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

    对于产品='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   
    

          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
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Ditto    6 年前

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

    你现在的问题是,分析人员并没有“尊重”这个案子。。那就是。。它计算分析,尽管情况。。。然后根据您的案例显示分析结果。

    问题是 精明的 你的分析功能首先。。。然后它处理这个案子。。。因此,解析函数使用所有行进行计算,但只在所需的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.
    
        2
  •  1
  •   Joshua Schlichting    6 年前

    添加 PRODUCT 给你的 PARTITION BY

    CASE
        WHEN PRODUCT LIKE '%B%'
            THEN MIN(Ranking_Output) OVER (PARTITION BY User, Product)
        ELSE 1
    END MIN_DETECTOR
    
        3
  •  0
  •   Gordon Linoff    6 年前

    您似乎希望在每行之前得到非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)