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