На основе шаблона sql запрос - PullRequest
1 голос
/ 06 августа 2020

Таблица:

col1          col2          col3           col4
17            5678          abc            mno
16            5678          abc            mno
15            5678          abc            mno
14            5678          abc            mno
13            5678          abc            mno
10            1234          def            pqr

Я хочу создать столбец output со значением 'a' или 'b'

 col1          col2          col3           col4           output
 17            5678          abc            mno            b
 16            5678          abc            mno            a
 15            5678          abc            mno            b
 14            5678          abc            mno            b
 13            5678          abc            mno            a 
 10            1234          def            pqr            a

Для раздела по (или группы ) столбцов, а именно col3, col4 и порядок col1 and col2, вывод помечается значением 'a' как первое вхождение этой группы (например, строка 5), эта строка отмечает событие, которое может длиться 3 раза подряд, после чего снова output столбец должен быть помечен как 'a' (например, строка 2), если col1 находится в последовательности.

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

С функцией окна ROW_NUMBER():

select t.*,
  case mod(row_number() over (partition by t.col3, t.col4 order by t.col1, t.col2), 3) 
    when 1 then 'a'
    else 'b'
  end output
from tablename t 
order by t.col1 desc  

См. Демонстрацию . Результатов:

> COL1 | COL2 | COL3 | COL4 | OUTPUT
> ---: | ---: | :--- | :--- | :-----
>   17 | 5678 | abc  | mno  | b     
>   16 | 5678 | abc  | mno  | a     
>   15 | 5678 | abc  | mno  | b     
>   14 | 5678 | abc  | mno  | b     
>   13 | 5678 | abc  | mno  | a     
>   10 | 1234 | def  | pqr  | a 
0 голосов
/ 06 августа 2020

Это тип проблемы с промежутками и островками. Вам нужно перечислить строки на островах, а затем некоторые условные логики c:

select t.*,
       (case when mod(row_number() over (partition by col3, col4, seqnum - seqnum_2 order by col1, col2), 3) = 1
             then 'a' else 'b'
        end) as
from (select t.*,
             row_number() over (order by col1, col2) as seqnum,
             row_number() over (partition by col3, col4 order by col1, col2) as seqnum_2
     from t
     ) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...