создать столбец по шаблону sql oracle - PullRequest
0 голосов
/ 05 августа 2020

Я изучаю оконные функции и пытаюсь решить эту

Таблица:

colA         colB           colC         colD
70           3021           1234         a
69           3021           1234         b
68           3021           1234         a
67           3021           5678         a
2            4153           9170         b
1            4153           9170         a

Требуемый вывод:

colA         colB           colC         colD      output
70           3021           1234         a         2
69           3021           1234         b         (null)
68           3021           1234         a         1
67           3021           5678         a         1
2            4153           9170         b         (null)
1            4153           9170         a         1

То, что я пробовал

select *,row_number() over (partition by colB,colC order by colA,colB)
from table;

Это обеспечит номер строки повсюду, но номер строки потребуется только для colD = a

Для группы colB и col C номер строки должен быть сгенерирован только там, где colD = ' a '.

Например, для группы colB и col C (3021 и 1234) выводом будет инкрементная строка с номерами 1 и 2, где colD=a, иначе вывод будет null

Ответы [ 4 ]

1 голос
/ 05 августа 2020

Вы можете использовать row_number() для перечисления строк и case для присвоения значений:

select t.*,
       (case when cold = 'a'
             then row_number() over (partition by colb, cold order by cola)
        end) as output
from t;
0 голосов
/ 05 августа 2020

Точный результат, как ожидалось.

SQLFiddle

select * from (
SELECT A.*, CASE WHEN COLD = 'a' then row_number() over(partition by colb, colc order by colb , colc, cold, cola ) else null end as rn
from table1 a ) order by 1 desc ;
0 голосов
/ 05 августа 2020

Увидев ожидаемый результат, ниже должно работать

select t.*,case 
            when cold = 'a'
            then row_number() over (partition by colb, colc,cold order by cola)
           end as output
from table1 t order by cola desc;
0 голосов
/ 05 августа 2020

Вы можете попробовать следующий способ -

select *,
  case when cold='a' then count(case when cold='a' then cold end) 
           over(partition by colb order by cola) end as output
from t1 order by cola desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...