2016-12-01 2 views
0

Я хотел бы ранжировать строки на основе их ранней даты. Однако, если родной брат (строка в той же группе) имеет более высокий рейтинг, это повлияет на их ранжирование.MySQL: используйте раннюю дату группы, чтобы определить ранг каждой строки.

id | group | date 
1  11  2016-12-1 
2  11  2016-01-1 
3  22  2016-02-1 
4  22  2016-05-1 
5  3  2016-04-1 
6  3  2016-06-1 

В настоящее время:

SELECT *, @curRank := @curRank + 1 AS rank 
FROM table 
SELECT @curRank := 0) r 
ORDER BY date ASC 

id | group | date  | rank 
2  11  2016-01-1 1 
3  22  2016-02-1 2 
5  3  2016-04-1 3 
4  22  2016-05-1 4 
6  3  2016-06-1 5 
1  11  2016-12-1 6 

Мне нужно достичь

id | group | date  | rank 
2  11  2016-01-1 1 
1  11  2016-12-1 6 
3  22  2016-02-1 2 
4  22  2016-05-1 4 
5  3  2016-04-1 3 
6  3  2016-06-1 5 
+1

Я думаю, что вы хотите/должны принять 2 прохода в этом. Первый проход принимает самую низкую дату для каждой группы и ранжирует ее, а затем повторно оценивает в соответствии с порядком ранга для группы, а затем даты. – xQbert

+0

Группы могут иметь несколько братьев и сестер, поэтому я не уверен, как это сделать, если это будет работать для 3-го, 4-го ... элементов в группе. – Kris

ответ

1

Я переименовал таблицу, чтобы test1 и столбец группы для Groupp потому группа является зарезервированным словом.

Следующий запрос даст вам желаемый результат

SELECT t1.* 
FROM (SELECT id, groupp, min(date), @rownum := @rownum + 1 as rank 
     FROM test1, (SELECT @rownum := 0) r 
     GROUP BY groupp 
     ORDER BY date ASC) qry 
INNER JOIN test1 t1 on t1.groupp = qry.groupp 
ORDER BY qry.rank, t1.date asc; 

Запрос, помеченный QRY поможет вам запись с минимальной датой для каждого Groupp. Запрос t1 доставит вам все записи из таблицы. При объединении этих двух столбцов groupp вы в основном получите все записи из таблицы с соответствующим рангом на основе результата первого запроса. Тогда вы просто заказываете по рангу и дате.

Я проверил запрос и возвращает желаемый результат с SQL скрипку

http://sqlfiddle.com/#!9/90dee/1

+0

Вы должны объяснить логику или предоставить некоторые условия. –

0

Похоже, вы могли бы просто гнездятся существующий запрос как вид инлайн и запустить рейтинг снова.

UNTESTED:

SELECT Z.*, @newRank := @newRank + 1 as NewRank 
FROM (SELECT *, @curRank := @curRank + 1 AS rank 
     FROM foo 
     CROSS JOIN (SELECT @curRank := 0) r 
     ORDER BY mdate ASC) Z 
CROSS JOIN (Select @newRank :=0) 
ORDER BY rank, mdate 
Смежные вопросы