2016-12-06 5 views
2

Этот вопрос задавался и отвечал много раз раньше, но мой случай немного отличается.SQL ORDER BY до GROUP BY

Скажем, у меня есть эти данные:

------------------------------ 
| id  | date   | 
------------------------------ 
| 1  | 2016-07-15  | 
| 1  | 2016-07-16  | 
| 2  | 2016-07-24  | 
| 2  | 2016-07-25  | 
| 1  | 2016-07-29  | 
| 1  | 2016-07-30  | 
------------------------------ 

Я хочу сначала упорядочивать по date колонке, а затем сгруппировать их по id колонке и возьмите max(date) для каждого id.

Так что я хотел бы получить этот

------------------------------ 
| id  | max(date)  | 
------------------------------ 
| 1  | 2016-07-16  | 
| 2  | 2016-07-25  | 
| 1  | 2016-07-30  | 
------------------------------ 

Обратите внимание, что id=1 появляется дважды, потому что заказ на вызванных 2 отдельных «групп» id=1, с группой id=2 между ними.

Я имею в виду, что я хочу, чтобы функция group by группировала только строки того же значения, которые расположены рядом друг с другом по статье order by.

Как я могу это сделать?

+0

Что разница максимальная дата позволила так, что разница делает эти даты ставят в одну группу? – 1000111

+0

@ 1000111 нет «разностного предела». Дело в том, что я хочу группировать только строки одного и того же 'id', которые были размещены рядом друг с другом в разделе' order by' – Malki

+0

. У вас нет первичного ключа в вашей таблице? – 1000111

ответ

4

Я думаю, вы должны использовать переменную здесь.

select id, `date` 
from (
    select 
     id, 
     `date`, 
     @rowno := case when @grp = id then @rowno + 1 else 0 end as rowno, 
     @grp := id 
    from (
     select * 
     from yourtable 
     order by `date` desc 
    ) t1 
    cross join (select @grp := null, @rowno = 0) t2 
) main 
where main.rowno = 0 
order by `date`; 

внутренний запрос будет организовать запись, как это,

--------------------------------------------- 
| id  | date   | rowno | @grp | 
--------------------------------------------- 
| 1  | 2016-07-30  | 0  | 1 | 
| 1  | 2016-07-29  | 1  | 1 | 
| 2  | 2016-07-25  | 0  | 2 | 
| 2  | 2016-07-24  | 1  | 2 | 
| 1  | 2016-07-16  | 0  | 1 | 
| 1  | 2016-07-15  | 1  | 1 | 
--------------------------------------------- 

тогда, когда пункт rowno = 0 получит то, что вы хотите.

SQLFiddle Demo

+0

Это возвращает первую дату вместо последней даты на идентификатор. –

+0

Это кажется довольно умным, это гарантированный заказ без 'ORDER BY' в' main'? – mendosi

+0

@ P.Salmon Я протестировал его, также вы можете запустить этот запрос в sqlfiddle, но он кажется пустым. – Blank

 Смежные вопросы

  • Нет связанных вопросов^_^