(извините, вы не заметили, какую БД вы используете .. Я работаю Oracle .. поэтому синтаксис может не совпадать с вашим ...)
Проблема, с которой вы столкнулись, заключается в аналитика не "соблюдает" дело ... то есть .. она вычисляет аналитику c независимо от дела ... затем отображает результаты аналитики c на основе вашего дела.
[править ] это звучало не так ясно, как я хотел ... давайте попробуем это: запрос вычисляет сначала вашу аналитическую функцию ... затем она обрабатывает регистр ... поэтому аналитическая функция использует ВСЕ строки для его расчета, но затем отображать только те значения 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.