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
我有一个 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