sql - считать один столбец на основе другого столбца - PullRequest
0 голосов
/ 30 октября 2018

У меня есть набор данных

case_id    subcase_id
1      | 1-1
1      | 1-2
1      | 1-3
1      | 1-6
2      | 2-1
2      | 2-7

Я хочу следующий вывод. Идея состоит в том, чтобы подсчитать вхождение подслоя, соответствующего регистру.

case_id  subcase_id
1      | 1-1          | 1
1      | 1-2          | 2
1      | 1-3          | 3
1      | 1-6          | 4
2      | 2-1          | 1
2      | 2-7          | 2

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Вот запрос, который должен вести себя так, как вы хотите. Мы должны выделить два числовых компонента subcase_id, а затем привести их к целым числам, чтобы избежать сортировки этого столбца как текста.

SELECT
    case_id,
    subcase_id,
    ROW_NUMBER() OVER (PARTITION BY case_id
        ORDER BY TO_NUMBER(SUBSTR(subcase_id, 1, INSTR(subcase_id, '-') - 1)),
                 TO_NUMBER(SUBSTR(subcase_id, INSTR(subcase_id, '-') + 1))) rn
FROM yourTable
ORDER BY
    case_id,
    TO_NUMBER(SUBSTR(subcase_id, 1, INSTR(subcase_id, '-') - 1)),
    TO_NUMBER(SUBSTR(subcase_id, INSTR(subcase_id, '-') + 1));

Демо

Не следует рассматривать столбец subcase_id как текст и числа. Если вам действительно нужна сортировка по этому столбцу в течение длительного времени, я предлагаю разделить два числовых компонента на отдельные числовые столбцы.

0 голосов
/ 30 октября 2018

Вы можете использовать count() over (partition by .. order by ..) как:

    with t(case_id,subcase_id) as
    (   
     select 1,'1-1' from dual union all
     select 1,'1-2' from dual union all
     select 1,'1-3' from dual union all
     select 1,'1-6' from dual union all
     select 2,'2-1' from dual union all
     select 2,'2-7' from dual
    )
     select t.*,
            count(*) over (partition by case_id order by subcase_id)              
            as result
       from t;

    CASE_ID     SUBCASE_ID   RESULT
    -------     ----------   ------ 
       1            1-1        1
       1            1-2        2
       1            1-3        3
       1            1-6        4
       2            2-1        1
       2            2-7        2

где subcase_id часто меняется и различается для всех значений, а case_id редко меняется.

Rextester Demo

0 голосов
/ 30 октября 2018

Вы можете попробовать использовать функцию row_number ()

select 
   caseid,
   subcase_id, 
   row_number() over(partition by caseid 
      order by 
      cast(SUBSTR(subcase_id, 1,INSTR(subcase_id, '-') -1) as number), 
      cast(SUBSTR(subcase_id, INSTR(subcase_id, '-') +1) as number)) as rn
from tablename
...