我有一个如下表:
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
((很抱歉,没有注意到您正在使用的数据库。
[您所遇到的问题是分析方法不是在“尊重”案例..也就是说,尽管有案例,它仍会计算分析...然后根据您的案例显示分析结果。
[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
PRODUCT
添加到您的PARTITION BY