假設一個用戶沒有使用相同的最大困難兩項任務,你可以做這樣的事情。雖然這不是很高效。它可以在小數據集上正常工作,但如果數據集非常大,則應重新設計。希望它能讓你指出正確的方向。
declare @users table (user_id int, username varchar(10))
declare @tasks table (task_id int, user_id int, taskname varchar(24), difficulty int)
insert into @users values
(1, 'John'),
(2, 'Sally'),
(3, 'Sam')
insert into @tasks values
(1, 1, 'prepare grocery list', 1),
(2, 1, 'do shopping', 2),
(3, 1, 'cook food', 3),
(4, 2, 'do shopping', 2),
(5, 2, 'prepare grocery list', 1),
(6, 3, 'cook food', 3)
select u.user_id, u.username, t.task_id, t.taskname, t.difficulty
from @users u
left join @tasks t on u.user_id = t.user_id
where t.difficulty = (
select max(x.difficulty)
from @tasks x
where t.user_id = x.user_id
)
這將是更好的性能:
select u.user_id, u.username, t.task_id, t.taskname, t.difficulty
from @users u
left join @tasks t on u.user_id = t.user_id
inner join (
select x.user_id, max(x.difficulty) as max_difficulty
from @tasks x
group by x.user_id
) as y on t.user_id = y.user_id and t.difficulty = y.max_difficulty
這兩個查詢返回以下數據集:
user_id username task_id taskname difficulty
----------- ---------- ----------- ------------------------ -----------
1 John 3 cook food 3
2 Sally 4 do shopping 2
3 Sam 6 cook food 3
如果用戶有同樣的困難兩根最大的任務,那麼,查詢將包含該用戶的兩行。
儘管顯示此SQL的查詢計劃表示第二個查詢的開銷幾乎是第一個查詢開銷的兩倍。在where
子句中使用max()
似乎比將max()
置於from
子句中效率更高。我會在您的真實數據上嘗試這兩種方式,並查看查詢計劃/成本對您的影響。
你的既定目標(顯示每個用戶以及他們最困難的任務),不能用簡單的'最大()來完成'和'組by',因爲它會顯示所有任務名稱每個用戶以及每個任務的最大難度。你使用的是什麼DBMS?您如何處理一個用戶有兩個任務都是相同(最大)難度的情況? –
看到這裏:http://sqlfiddle.com/#!9/03994e/1 似乎工作正常 – Riad
@Riad - 該OP是使用一個DBMS,強制'select'子句中的所有非聚合字段也是在'group by'子句中,sqlfiddle不執行該限制。我懷疑OP正在使用SQL Server。 –