首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sql -根据另一列对一列进行计数

sql -根据另一列对一列进行计数
EN

Stack Overflow用户
提问于 2018-10-30 11:45:56
回答 3查看 274关注 0票数 2

我有一个数据集

代码语言:javascript
运行
复制
case_id    subcase_id
1      | 1-1
1      | 1-2
1      | 1-3
1      | 1-6
2      | 2-1
2      | 2-7

我想要以下输出。其思想是计算与案例相对应的子案例的出现次数。

代码语言:javascript
运行
复制
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
EN

回答 3

Stack Overflow用户

发布于 2018-10-30 11:50:33

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

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-10-30 13:21:41

您可以像这样使用count() over (partition by .. order by ..)子句:

代码语言:javascript
运行
复制
    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变化很少。

票数 1
EN

Stack Overflow用户

发布于 2018-10-30 11:55:07

这是一个查询,它的行为应该是你想要的。我们必须分离subcase_id的两个数字部分,然后将它们转换为整数,以避免将此列作为文本进行排序。

代码语言:javascript
运行
复制
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));

Demo

同时将subcase_id列视为文本和数字并不是一个好主意。如果您确实长期需要对此列进行排序,那么我建议将这两个数字部分分开作为单独的数字列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53057103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档