2013-08-01 3 views
0
Number | UserId | Priority 
-------------------------- 
1234 | User1 | 1 
2345 | User1 | 2 
5678 | User1 | 3 
2456 | User2 | 1 
6556 | User2 | 2 
2435 | User3 | 1 
6567 | User3 | 2 

Я хочу, чтобы извлечь из списка ниже в строке на основе наибольшего значения приоритетаSQL запрос для ниже операций

Number | UserId | Priority 
-------------------------- 
5678 | User1 | 3 
6556 | User2 | 2 
6567 | User3 | 2 

Учитывая имя таблицы USERCODE может кто-то помочь с SQL-запросом для этого.

+2

Пожалуйста, покажите нам, что вы пытались и что пошло не так. –

+0

Какой движок sql вы используете, и хотите ли вы только верхние три строки с наивысшим приоритетом? –

+0

@OndrejSvejdar Я хочу только строки с высоким приоритетом каждого UserId – user2642604

ответ

1
Select A.number,A.userId,A.Priority from TableName A 
inner join 
(
Select UserId,Max(Priority) as Priority from TableName group by UserId 
) B on A.Priority =B.Priority and A.UserId=B.UserId 

Sql Fiddle Demo

1

Другой способ написать это

select 
a.* 
from 
TableName a 
left join TableName b 
on a.Priority < b.Priority 
and a.UserId = b.UserId 
where b.Priority is null 

ЛЕВАЯ РЕГИСТРИРУЙТЕСЬ работает на том основании, что когда a.priority находится на максимальном значении, не b.priority с большее значение и значения b строк будут NULL.

Посмотрите, работает ли он в sqlfiddle.

+0

Спасибо :) Это работает для меня. Но когда выполнено на 67000 строк данных, он берет меня около 3 секунд, чтобы получить результат из 5 строк. есть ли способ увеличить производительность? – user2642604

+0

Имейте индексы для UserId и Priority, и он должен работать в миллисекундах. – fancyPants

0
SELECT A.Number, A.UserId, A.Priority 
FROM usercodeTBL A 
INNER JOIN(SELECT UserId, Max(Priority) AS Priority FROM usercodeTBL GROUP BY UserId) B 
ON A.Priority = B.Priority AND A.UserId = B.UserId 
ORDER BY UserId, Priority DESC 
Смежные вопросы