我们可以修改这个查询吗?
can we modify this query?
我不想让它看起来太复杂。有没有其他方法可以使用简单的关键字来编写此代码(如果它变长就可以了)?
table 的代码:
CREATE TABLE job_data
(
ds DATE,
job_id INT NOT NULL,
actor_id INT NOT NULL,
event VARCHAR(15) NOT NULL,
language VARCHAR(15) NOT NULL,
time_spent INT NOT NULL,
org CHAR(2)
);
INSERT INTO job_data (ds, job_id, actor_id, event, language, time_spent, org)
VALUES ('2020-11-30', 21, 1001, 'skip', 'English', 15, 'A'),
('2020-11-30', 22, 1006, 'transfer', 'Arabic', 25, 'B'),
('2020-11-29', 23, 1003, 'decision', 'Persian', 20, 'C'),
('2020-11-28', 23, 1005,'transfer', 'Persian', 22, 'D'),
('2020-11-28', 25, 1002, 'decision', 'Hindi', 11, 'B'),
('2020-11-27', 11, 1007, 'decision', 'French', 104, 'D'),
('2020-11-26', 23, 1004, 'skip', 'Persian', 56, 'A'),
('2020-11-25', 20, 1003, 'transfer', 'Italian', 45, 'C');
我想修改下面的代码。
WITH cte AS
(
SELECT ds, COUNT(job_id) AS no_of_jobs, SUM(time_spent) AS time_taken
FROM job_data
WHERE event in ('transfer', 'decision')
AND ds BETWEEN '2020-11-01' AND '2020-11-30'
GROUP BY ds
)
SELECT ds, SUM(no_of_jobs)
OVER ( order by ds range between unbounded preceding and current row)/sum(time_taken)
over (order by ds range between unbounded preceding and current row) as throughput_7d
from cte;
用子查询替换cte
。
SELECT ds, SUM(no_of_jobs)
OVER ( order by ds range between unbounded preceding and current row)/sum(time_taken)
over (order by ds range between unbounded preceding and current row) as throughput_7d
FROM (
SELECT ds, COUNT(job_id) AS no_of_jobs, SUM(time_spent) AS time_taken
FROM job_data
WHERE event in ('transfer', 'decision')
AND ds BETWEEN '2020-11-01' AND '2020-11-30'
GROUP BY ds
) AS cte
如果您需要在主查询中多次引用它,cte
很有用,如果您只使用它一次,则不需要它。
我不想让它看起来太复杂。有没有其他方法可以使用简单的关键字来编写此代码(如果它变长就可以了)?
table 的代码:
CREATE TABLE job_data
(
ds DATE,
job_id INT NOT NULL,
actor_id INT NOT NULL,
event VARCHAR(15) NOT NULL,
language VARCHAR(15) NOT NULL,
time_spent INT NOT NULL,
org CHAR(2)
);
INSERT INTO job_data (ds, job_id, actor_id, event, language, time_spent, org)
VALUES ('2020-11-30', 21, 1001, 'skip', 'English', 15, 'A'),
('2020-11-30', 22, 1006, 'transfer', 'Arabic', 25, 'B'),
('2020-11-29', 23, 1003, 'decision', 'Persian', 20, 'C'),
('2020-11-28', 23, 1005,'transfer', 'Persian', 22, 'D'),
('2020-11-28', 25, 1002, 'decision', 'Hindi', 11, 'B'),
('2020-11-27', 11, 1007, 'decision', 'French', 104, 'D'),
('2020-11-26', 23, 1004, 'skip', 'Persian', 56, 'A'),
('2020-11-25', 20, 1003, 'transfer', 'Italian', 45, 'C');
我想修改下面的代码。
WITH cte AS
(
SELECT ds, COUNT(job_id) AS no_of_jobs, SUM(time_spent) AS time_taken
FROM job_data
WHERE event in ('transfer', 'decision')
AND ds BETWEEN '2020-11-01' AND '2020-11-30'
GROUP BY ds
)
SELECT ds, SUM(no_of_jobs)
OVER ( order by ds range between unbounded preceding and current row)/sum(time_taken)
over (order by ds range between unbounded preceding and current row) as throughput_7d
from cte;
用子查询替换cte
。
SELECT ds, SUM(no_of_jobs)
OVER ( order by ds range between unbounded preceding and current row)/sum(time_taken)
over (order by ds range between unbounded preceding and current row) as throughput_7d
FROM (
SELECT ds, COUNT(job_id) AS no_of_jobs, SUM(time_spent) AS time_taken
FROM job_data
WHERE event in ('transfer', 'decision')
AND ds BETWEEN '2020-11-01' AND '2020-11-30'
GROUP BY ds
) AS cte
如果您需要在主查询中多次引用它,cte
很有用,如果您只使用它一次,则不需要它。