[英]SQL - Optimize query for iteration
我正在循環使用此查詢,並希望使其更快。
SELECT * FROM job_activity as ja
INNER JOIN job as j
ON ja.job_id = j.id
WHERE j.name = 'name'
AND ja.avg_runtime <> 0
AND ja.id = (SELECT MAX(id) FROM job_activity
WHERE job_id = ja.job_id and avg_runtime <> 0);
使用MS SQL 11,我將兩個表job和job_activity聯接在一起,使用的job ID等於job.name,這將在job_activity表上找到該作業的avg_runtime,但這樣做是針對一個大數據集。 使用“ with”查詢會更好嗎?
表格布局
job
****
id
name
job_activity
*************
id
job_id
avg_runtime
這是修改后的查詢,在此查詢中,我們在子查詢中使用group by獲得最大的收益,並進行內部聯接。
SELECT * FROM job_activity as ja
join job as j
on ja.job_id = j.id
INNER JOIN
(
select ja.job_id, max(id) as id from job_activity ja
join job j
ON j.id = ja.job_id
where avg_runtime <> 0
and j.name = 'name'
group by job_id
) T
ON T.id = ja.id
您似乎正在尋找一個人可能從事的每項工作的最新活動。 然后,您想要每個工作的最新活動。 就是說,我要啟動第一個預查詢(別名PreMax),在該查詢中,我將有問題的人的所有作業ID都加入到具有avg_runtime <> 0的作業活動中。max()通過僅按工作分組。 由此,它將是基於avg_runtime合格人員的所有工作的唯一列表。 這樣就可以基於這些值將簡單的重新聯接返回到作業和作業活動表,並返回所有數據。
SELECT
j2.*, ja2.*
FROM
( SELECT
j.ID,
MAX( ja.id ) as MaxJAID
from
job j
join job_activity ja
ON j.id = ja.job_id
and ja.avg_runtime <> 0
where
j.name = 'name'
group by
j.id ) PreMax
JOIN job j2 on PreMax.id = j2.id
JOIN job_activity ja2 on PreMax.MaxJAID = ja2.id
嘗試:
SELECT a.*
FROM(
SELECT *,
ROW_NUMBER()OVER(PARTITION BY ja.job_id ORDER BY ja.id DESC) as rnk
FROM job_activity as ja
INNER JOIN job as j
ON ja.job_id = j.id
WHERE j.name = 'name'
AND ja.avg_runtime <> 0 )a
WHERE a.rnk = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.