最小分割数,当有情况时

问题描述 投票:0回答:3

我有一个如下表:

      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   

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

      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
sql snowflake-data-warehouse partition
3个回答
1
投票

((很抱歉,没有注意到您正在使用的数据库。

[您所遇到的问题是分析方法不是在“尊重”案例..也就是说,尽管有案例,它仍会计算分析...然后根据您的案例显示分析结果。

[edit]听起来不像我想要的那么清晰..让我们尝试一下:该查询首先是您的分析函数,然后处理该情况,因此该分析函数使用所有行进行计算,但随后仅显示所需的B值。[/ edit]

要使其更准确地计算出所需的值,请将产品包括在分区中:

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

所以:(仅供参考,因为“用户”是保留字,所以我使用“ cuser”作为列。)

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.

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

PRODUCT添加到您的PARTITION BY

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


0
投票
您似乎希望每行之前的非B值之和。如果是这样:

0
投票
PRODUCT添加到您的PARTITION BY
© www.soinside.com 2019 - 2024. All rights reserved.