のようなものを探していると思います。しかし、これはあまり効果がありません。小さなデータセットでは正常に動作しますが、データセットが非常に大きい場合は再設計する必要があります。うまくいけば、それは正しい方向にあなたを指差しさせるでしょう。
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
)
これは、よりパフォーマンスになります。ユーザーは、その後、同じ難易度を持つ2つの最大のタスクを持っている場合
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
:
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
は、これらのクエリの両方が、次のデータセットを返しますクエリにはそのユーザーの2つの行が含まれます。
このSQLのクエリプランを示すと、2番目のクエリのコストは1番目のクエリのコストの約2倍になります。 where
句にmax()
があることは、from
句にmax()
を配置するより効率的と思われます。私はあなたの実際のデータで両方の方法を試してみて、クエリプラン/コストがあなたにとって何であるかを見てみましょう。
をお試しください各ユーザー、および各タスクの最大難易度を示します。どのDBMSを使用していますか? 1人のユーザーが同じ(最大)困難な2つのタスクを持つ状況を、どのように処理する必要がありますか? –
ここをクリック:http://sqlfiddle.com/#!9/03994e/1 はうまく動作しているようです – Riad
@Riad - OPはDBMSを使用しています。 'group by'節では、sqlfiddleはその制限を強制していません。 OPがSQL Serverを使用していると思われます。 –