Вывод 2 последних значений из группировки - MySQL
Формулировка задачи:
Доброго времени суток,
помогите разобраться, всю голову сломал уже.
Нужно сгруппировать элементы по колонке Name и вывести 2 последних из группы, отсортированных по дате.
Таблица вида:
id | name | date | money
1 | Костя | 2016-05-10 | 200
2 | Костя | 2016-05-11 | 300
3 | Игорь | 2016-05-09 | 800
4 | Костя | 2016-05-12 | 100
5 | Игорь | 2016-05-11 | 200
6 | Павел | 2016-05-06 | 400
7 | Игорь | 2016-05-18 | 700
Должно получится так:
Костя | 2016-05-12 | 100
Костя | 2016-05-11 | 300
Игорь | 2016-05-18 | 700
Игорь | 2016-05-11 | 200
Павел | 2016-05-06 | 400
Смог сделать только группировку, сортировку по последней дате и вывод одной записи:
SELECT * FROM (SELECT id,name,DATE,money FROM sp_data ORDER BY DATE DESC) AS temp GROUP BY name ORDER BY DATE DESC
Решение задачи: «Вывод 2 последних значений из группировки»
textual
Листинг программы
SELECT t1.id, t1.name, t1.date, t1.money, COUNT(*) AS counter FROM sp_data t1 JOIN sp_data t2 ON t1.name = t2.name AND t1.id <= t2.id GROUP BY t1.name, t1.date HAVING counter <= 2 ORDER BY name, DATE DESC
Объяснение кода листинга программы
В данном коде выполняется группировка данных по имени и дате, затем происходит подсчет количества записей в каждой группе. После этого, из каждой группы выбираются две последние записи по дате. Результатом запроса является список с id, именем, датой, деньгами и количеством записей в группе.
- SELECT - выбираем нужные поля из таблицы t1.id, t1.name, t1.date, t1.money, COUNT(*) AS counter
- FROM - указываем таблицы, которые нужно объединить sp_data t1 JOIN sp_data t2 ON t1.name = t2.name AND t1.id <= t2.id
- GROUP BY - группируем данные по имени и дате GROUP BY t1.name, t1.date
- HAVING - применяем условие к группам HAVING counter <= 2
- ORDER BY - сортируем результаты по имени и дате в обратном порядке ORDER BY name, DATE DESC
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д