sql-基于另一列对一列进行计数

sql-基于另一列对一列进行计数,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,我有一个数据集 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

我有一个数据集

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

您可以尝试使用row_number()函数


下面是一个查询,它的行为应该符合您的要求。我们必须将
子类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\u id
列同时视为文本和数字不是一个好主意。如果您确实长期需要在此列上排序,那么我建议将这两个数字组成部分分开作为单独的数字列。

您可以使用
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
其中,子用例id经常更改,并且对于所有值都是不同的,而用例id很少更改


您的MySQL服务器版本是什么?我正在使用oracle 12请删除MySQL标记。Oracle MySQL子类别id中的前导数字是否始终映射到案例id?
subcase\u id
中的尾随数字是否可以扩展为两位或更多位?计数的顺序是否重要?这可能与
subcase\u id
类似
10-12
,无法正确排序,因为这样它将作为文本排序,而不是作为单独的数字。是的,我知道@TimBiegeleisen以了解我的意思^^@TimBiegeleisen谢谢我知道它是字符串,我需要将其拆分,然后将其转换为数字
    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