Минимальное разделение с делом, когда - PullRequest
0 голосов
/ 29 января 2020

У меня есть таблица, которая выглядит следующим образом:

      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, потому что это является частью большой таблицы, и вы хотите, чтобы вывод был похож на:

      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 ]

2 голосов
/ 29 января 2020

(извините, вы не заметили, какую БД вы используете .. Я работаю 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.
1 голос
/ 29 января 2020

Добавьте PRODUCT к вашему PARTITION BY

CASE
    WHEN PRODUCT LIKE '%B%'
        THEN MIN(Ranking_Output) OVER (PARTITION BY User, Product)
    ELSE 1
END MIN_DETECTOR
0 голосов
/ 29 января 2020

Кажется, вам нужна сумма не-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)
...