-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1767-FindTheSubtasksThatDidNotExecute.sql
More file actions
175 lines (167 loc) · 5.82 KB
/
1767-FindTheSubtasksThatDidNotExecute.sql
File metadata and controls
175 lines (167 loc) · 5.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
-- 1767. Find the Subtasks That Did Not Execute
-- Table: Tasks
-- +----------------+---------+
-- | Column Name | Type |
-- +----------------+---------+
-- | task_id | int |
-- | subtasks_count | int |
-- +----------------+---------+
-- task_id is the column with unique values for this table.
-- Each row in this table indicates that task_id was divided into subtasks_count subtasks labeled from 1 to subtasks_count.
-- It is guaranteed that 2 <= subtasks_count <= 20.
-- Table: Executed
-- +---------------+---------+
-- | Column Name | Type |
-- +---------------+---------+
-- | task_id | int |
-- | subtask_id | int |
-- +---------------+---------+
-- (task_id, subtask_id) is the combination of columns with unique values for this table.
-- Each row in this table indicates that for the task task_id, the subtask with ID subtask_id was executed successfully.
-- It is guaranteed that subtask_id <= subtasks_count for each task_id.
-- Write a solution to report the IDs of the missing subtasks for each task_id.
-- Return the result table in any order.
-- The result format is in the following example.
-- Example 1:
-- Input:
-- Tasks table:
-- +---------+----------------+
-- | task_id | subtasks_count |
-- +---------+----------------+
-- | 1 | 3 |
-- | 2 | 2 |
-- | 3 | 4 |
-- +---------+----------------+
-- Executed table:
-- +---------+------------+
-- | task_id | subtask_id |
-- +---------+------------+
-- | 1 | 2 |
-- | 3 | 1 |
-- | 3 | 2 |
-- | 3 | 3 |
-- | 3 | 4 |
-- +---------+------------+
-- Output:
-- +---------+------------+
-- | task_id | subtask_id |
-- +---------+------------+
-- | 1 | 1 |
-- | 1 | 3 |
-- | 2 | 1 |
-- | 2 | 2 |
-- +---------+------------+
-- Explanation:
-- Task 1 was divided into 3 subtasks (1, 2, 3). Only subtask 2 was executed successfully, so we include (1, 1) and (1, 3) in the answer.
-- Task 2 was divided into 2 subtasks (1, 2). No subtask was executed successfully, so we include (2, 1) and (2, 2) in the answer.
-- Task 3 was divided into 4 subtasks (1, 2, 3, 4). All of the subtasks were executed successfully.
-- Create table If Not Exists Tasks (task_id int, subtasks_count int)
-- Create table If Not Exists Executed (task_id int, subtask_id int)
-- Truncate table Tasks
-- insert into Tasks (task_id, subtasks_count) values ('1', '3')
-- insert into Tasks (task_id, subtasks_count) values ('2', '2')
-- insert into Tasks (task_id, subtasks_count) values ('3', '4')
-- Truncate table Executed
-- insert into Executed (task_id, subtask_id) values ('1', '2')
-- insert into Executed (task_id, subtask_id) values ('3', '1')
-- insert into Executed (task_id, subtask_id) values ('3', '2')
-- insert into Executed (task_id, subtask_id) values ('3', '3')
-- insert into Executed (task_id, subtask_id) values ('3', '4')
-- 使用 recursive 生成任务
WITH RECURSIVE t AS
(
SELECT 1 AS subtask_id
UNION ALL
SELECT subtask_id + 1 FROM t WHERE subtask_id <= 20 -- 保证 2 <= subtasks_count <= 20
)
SELECT
task_id,
subtask_id
FROM
Tasks, t
WHERE
(task_id, subtask_id) NOT IN ( SELECT * FROM Executed ) AND
subtask_id <= subtasks_count -- 对于每一个task_id,subtask_id <= subtasks_count
-- SELECT
-- t.task_id,
-- s.subtask_id
-- FROM
-- Tasks AS t
-- CROSS JOIN
-- (
-- SELECT 1 AS subtask_id UNION
-- SELECT 2 AS subtask_id UNION
-- SELECT 3 AS subtask_id UNION
-- SELECT 4 AS subtask_id UNION
-- SELECT 5 AS subtask_id UNION
-- SELECT 6 AS subtask_id UNION
-- SELECT 7 AS subtask_id UNION
-- SELECT 8 AS subtask_id UNION
-- SELECT 9 AS subtask_id UNION
-- SELECT 10 AS subtask_id UNION
-- SELECT 11 AS subtask_id UNION
-- SELECT 12 AS subtask_id UNION
-- SELECT 13 AS subtask_id UNION
-- SELECT 14 AS subtask_id UNION
-- SELECT 15 AS subtask_id UNION
-- SELECT 16 AS subtask_id UNION
-- SELECT 17 AS subtask_id UNION
-- SELECT 18 AS subtask_id UNION
-- SELECT 19 AS subtask_id UNION
-- SELECT 20 AS subtask_id
-- ) AS s
-- WHERE
-- t.subtasks_count >= subtask_id
-- ORDER BY
-- task_id, subtask_id
-- | task_id | subtask_id |
-- | ------- | ---------- |
-- | 1 | 1 |
-- | 1 | 2 |
-- | 1 | 3 |
-- | 2 | 1 |
-- | 2 | 2 |
-- | 3 | 1 |
-- | 3 | 2 |
-- | 3 | 3 |
-- | 3 | 4 |
-- use union
SELECT
*
FROM
(-- 生成一张完整的 task_id + subtask_id 表
SELECT
t.task_id,
s.subtask_id
FROM
Tasks AS t
CROSS JOIN
(
SELECT 1 AS subtask_id UNION
SELECT 2 AS subtask_id UNION
SELECT 3 AS subtask_id UNION
SELECT 4 AS subtask_id UNION
SELECT 5 AS subtask_id UNION
SELECT 6 AS subtask_id UNION
SELECT 7 AS subtask_id UNION
SELECT 8 AS subtask_id UNION
SELECT 9 AS subtask_id UNION
SELECT 10 AS subtask_id UNION
SELECT 11 AS subtask_id UNION
SELECT 12 AS subtask_id UNION
SELECT 13 AS subtask_id UNION
SELECT 14 AS subtask_id UNION
SELECT 15 AS subtask_id UNION
SELECT 16 AS subtask_id UNION
SELECT 17 AS subtask_id UNION
SELECT 18 AS subtask_id UNION
SELECT 19 AS subtask_id UNION
SELECT 20 AS subtask_id
) AS s
WHERE
t.subtasks_count >= subtask_id
ORDER BY
task_id, subtask_id
) AS a
WHERE
(task_id,subtask_id) NOT IN ( SELECT * FROM Executed)