Sql 从包含活动及其任务的表中提取流程(流程类型)

Sql 从包含活动及其任务的表中提取流程(流程类型),sql,oracle,Sql,Oracle,我的工作活动及其任务如下表所示: TASK_ID | TASK_TYPE_ID | TASK_NAME | ACT_ID ========+==============+===========+======== 100000 | 101 | A | 300 100001 | 102 | B | 300 100002 | 103 | C | 300 100004 | 101

我的工作活动及其任务如下表所示:

TASK_ID | TASK_TYPE_ID | TASK_NAME | ACT_ID
========+==============+===========+========
100000  | 101          | A         | 300
100001  | 102          | B         | 300
100002  | 103          | C         | 300
100004  | 101          | A         | 310
100005  | 103          | C         | 310
100006  | 101          | A         | 312
100007  | 103          | C         | 312
100008  | 101          | A         | 314
100009  | 102          | B         | 314
可以看到,在这个表中有四个活动(300310312314),但有三个不同的过程。这里假设过程是不同的任务序列。第一个流程=A+B+C序列(在活动300中使用),第二个流程=A+C序列(在活动310和312中使用),第四个流程=A+B。也可能有其他具有(使用)相同流程的活动

我需要SQL,它将从这样的表中提取所有进程或进程类型(不同的任务序列)

结果输出应如下所示:

PROCESS | PROCESS_TASKS_SEQUENCE
========+=======================
1       | A,B,C
2       | A,C
3       | A,B

从输入数据中提取三个不同的流程,第一个流程由任务A+B+C组成,第二个流程由任务A+C组成,第三个流程由任务A+B组成。

这与您所追求的是什么

with sample_data as (select 100000 task_id, 101 task_type_id, 'Task A' task_name, 300 act_id from dual union all
                     select 100001 task_id, 102 task_type_id, 'Task B' task_name, 300 act_id from dual union all
                     select 100002 task_id, 103 task_type_id, 'Task C' task_name, 300 act_id from dual union all
                     select 100004 task_id, 101 task_type_id, 'Task A' task_name, 310 act_id from dual union all
                     select 100005 task_id, 103 task_type_id, 'Task C' task_name, 310 act_id from dual union all
                     select 100006 task_id, 101 task_type_id, 'Task A' task_name, 312 act_id from dual union all
                     select 100007 task_id, 103 task_type_id, 'Task C' task_name, 312 act_id from dual union all
                     select 100008 task_id, 101 task_type_id, 'Task A' task_name, 314 act_id from dual union all
                     select 100009 task_id, 102 task_type_id, 'Task B' task_name, 314 act_id from dual)
-- end of mimicking a table called sample_data which contains ... sample data. See SQL below:
select distinct task_name,
                dense_rank() over (order by length(task_list) desc, task_list) grp_num
from   (select task_id,
               task_type_id,
               task_name,
               act_id,
               listagg(task_type_id, ',') within group (order by task_type_id) over (partition by act_id) task_list
        from   sample_data)
order by grp_num, task_name;


TASK_NAME    GRP_NUM
--------- ----------
Task A             1
Task B             1
Task C             1
Task A             2
Task B             2
Task A             3
Task C             3

Oracle 11g R2架构设置

CREATE TABLE table_name ( TASK_ID, TASK_TYPE_ID, TASK_NAME, ACT_ID ) AS
          SELECT 100000, 101, 'A', 300 FROM DUAL
UNION ALL SELECT 100001, 102, 'B', 300 FROM DUAL
UNION ALL SELECT 100002, 103, 'C', 300 FROM DUAL
UNION ALL SELECT 100004, 101, 'A', 310 FROM DUAL
UNION ALL SELECT 100005, 103, 'C', 310 FROM DUAL
UNION ALL SELECT 100006, 101, 'A', 312 FROM DUAL
UNION ALL SELECT 100007, 103, 'C', 312 FROM DUAL
UNION ALL SELECT 100008, 101, 'A', 314 FROM DUAL
UNION ALL SELECT 100009, 102, 'B', 314 FROM DUAL
UNION ALL SELECT 100010, 102, 'B', 316 FROM DUAL
UNION ALL SELECT 100011, 101, 'A', 316 FROM DUAL
SELECT ROWNUM AS PROCESS,
       PROCESS_TASK_SEQUENCE
FROM   (
  SELECT DISTINCT
         LISTAGG( TASK_NAME, ',' ) WITHIN GROUP ( ORDER BY TASK_ID ) AS PROCESS_TASK_SEQUENCE
  FROM   table_name
  GROUP BY ACT_ID
)
| PROCESS | PROCESS_TASK_SEQUENCE |
|---------|-----------------------|
|       1 |                 A,B,C |
|       2 |                   A,B |
|       3 |                   A,C |
|       4 |                   B,A |
查询1

CREATE TABLE table_name ( TASK_ID, TASK_TYPE_ID, TASK_NAME, ACT_ID ) AS
          SELECT 100000, 101, 'A', 300 FROM DUAL
UNION ALL SELECT 100001, 102, 'B', 300 FROM DUAL
UNION ALL SELECT 100002, 103, 'C', 300 FROM DUAL
UNION ALL SELECT 100004, 101, 'A', 310 FROM DUAL
UNION ALL SELECT 100005, 103, 'C', 310 FROM DUAL
UNION ALL SELECT 100006, 101, 'A', 312 FROM DUAL
UNION ALL SELECT 100007, 103, 'C', 312 FROM DUAL
UNION ALL SELECT 100008, 101, 'A', 314 FROM DUAL
UNION ALL SELECT 100009, 102, 'B', 314 FROM DUAL
UNION ALL SELECT 100010, 102, 'B', 316 FROM DUAL
UNION ALL SELECT 100011, 101, 'A', 316 FROM DUAL
SELECT ROWNUM AS PROCESS,
       PROCESS_TASK_SEQUENCE
FROM   (
  SELECT DISTINCT
         LISTAGG( TASK_NAME, ',' ) WITHIN GROUP ( ORDER BY TASK_ID ) AS PROCESS_TASK_SEQUENCE
  FROM   table_name
  GROUP BY ACT_ID
)
| PROCESS | PROCESS_TASK_SEQUENCE |
|---------|-----------------------|
|       1 |                 A,B,C |
|       2 |                   A,B |
|       3 |                   A,C |
|       4 |                   B,A |

CREATE TABLE table_name ( TASK_ID, TASK_TYPE_ID, TASK_NAME, ACT_ID ) AS
          SELECT 100000, 101, 'A', 300 FROM DUAL
UNION ALL SELECT 100001, 102, 'B', 300 FROM DUAL
UNION ALL SELECT 100002, 103, 'C', 300 FROM DUAL
UNION ALL SELECT 100004, 101, 'A', 310 FROM DUAL
UNION ALL SELECT 100005, 103, 'C', 310 FROM DUAL
UNION ALL SELECT 100006, 101, 'A', 312 FROM DUAL
UNION ALL SELECT 100007, 103, 'C', 312 FROM DUAL
UNION ALL SELECT 100008, 101, 'A', 314 FROM DUAL
UNION ALL SELECT 100009, 102, 'B', 314 FROM DUAL
UNION ALL SELECT 100010, 102, 'B', 316 FROM DUAL
UNION ALL SELECT 100011, 101, 'A', 316 FROM DUAL
SELECT ROWNUM AS PROCESS,
       PROCESS_TASK_SEQUENCE
FROM   (
  SELECT DISTINCT
         LISTAGG( TASK_NAME, ',' ) WITHIN GROUP ( ORDER BY TASK_ID ) AS PROCESS_TASK_SEQUENCE
  FROM   table_name
  GROUP BY ACT_ID
)
| PROCESS | PROCESS_TASK_SEQUENCE |
|---------|-----------------------|
|       1 |                 A,B,C |
|       2 |                   A,B |
|       3 |                   A,C |
|       4 |                   B,A |

您可以添加您希望看到的结果表的示例吗?现在还不清楚你将要实现什么。在一个单独的表中其他地方定义的流程?或者你只是在按照动作id提取不同的任务组合之后?任务a+C的顺序不是任务C+a,这两个顺序是两个不同的流程。流程未在单独的表中定义!是的,给我一个按act_id分组的任务的不同组合列表(不要按顺序排序)。几乎,由于存在按任务类型_id排序的顺序,因此此查询不会将Process1与任务A+B和Process2与任务B+A区分开来。相同任务的不同顺序是不同的进程,我需要唯一的顺序(非有序任务)@sbrbot Updated-假设
TASK\u ID
按顺序递增,则您可以将其更改为
ORDER BY TASK\u ID