我有一个数据集
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
发布于 2018-10-30 11:50:33
您可以尝试使用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
发布于 2018-10-30 13:21:41
您可以像这样使用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变化很少。
发布于 2018-10-30 11:55:07
这是一个查询,它的行为应该是你想要的。我们必须分离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
列视为文本和数字并不是一个好主意。如果您确实长期需要对此列进行排序,那么我建议将这两个数字部分分开作为单独的数字列。
https://stackoverflow.com/questions/53057103
复制相似问题