2015-08-16 2 views
0

У меня есть таблица, которая отслеживает последние изменения, применяемые к студентам в каталоге студентов. Я хочу каждую минуту возвращать данные из этой таблицы, поэтому я могу скомпрометировать только необходимые записи с помощью своего приложения java.Как выбрать только последние записи на основе определенного значения столбца, сохраняющего текущий порядок таблицы

Бывает так, что мне нужен только последний элемент event_type для ID. Я только что создал небольшое искусство, чтобы наглядно объяснить, что хочу, но сайт не позволяет мне публиковать его из-за того, что моя репутация еще не установлена. Я попытаюсь опубликовать его ссылку:

What I have          What I would like 
+---------------------+------------+------------+ +---------------------+------------+------------+ 
| event_time   | event_type | student_id | | event_time   | event_type | student_id | 
+---------------------+------------+------------+ +---------------------+------------+------------+ 
| 2015-08-16 11:42:08 |   1 |   37 | | 2015-08-16 11:44:30 |   1 |   37 | 
| 2015-08-16 11:42:29 |   1 |   37 | | 2015-08-16 11:45:47 |   2 |   37 | 
| 2015-08-16 11:43:51 |   2 |   37 | | 2015-08-16 12:21:40 |   1 |   44 | 
| 2015-08-16 11:44:13 |   3 |   37 | | 2015-08-16 12:21:49 |   3 |   44 | 
| 2015-08-16 11:44:30 |   1 |   37 | | 2015-08-16 12:21:55 |   2 |   30 | 
| 2015-08-16 11:45:47 |   2 |   37 | | 2015-08-16 12:22:00 |   3 |   37 | 
| 2015-08-16 12:21:28 |   2 |   44 | | 2015-08-16 12:27:08 |   2 |   44 | 
| 2015-08-16 12:21:40 |   1 |   44 | +---------------------+------------+------------+ 
| 2015-08-16 12:21:49 |   3 |   44 | 
| 2015-08-16 12:21:55 |   2 |   30 | 
| 2015-08-16 12:22:00 |   3 |   37 | 
| 2015-08-16 12:27:08 |   2 |   44 | 
+---------------------+------------+------------+ 

Любая идея, как это сделать? Я искал сайт, но не нашел ничего подходящего для этого. Спасибо за помощь!

+0

Так вы хотите 3 самых последних событий для каждого студента? – Strawberry

+0

как вы произвольно придумываете этот jpg? так много для последнего за – Drew

+0

, если мой ответ [здесь] (http://stackoverflow.com/a/32030445/1816093) используется, адаптируйте его. Этот ответ был чем-то вроде последнего ответа на билеты – Drew

ответ

0

т.д .:

SELECT x.* 
    FROM my_table x 
    JOIN my_table y 
    ON y.student_id = x.student_id 
    AND y.event_time >= x.event_time 
GROUP 
    BY x.student_id 
    , x.event_time 
HAVING COUNT(*) <= 3 
ORDER 
    BY event_time; 

или, быстрее ...

SELECT event_time 
    , event_type 
    , student_id 
    FROM 
    (SELECT x.* 
      , CASE WHEN @prev = student_id THEN @i := @i + 1 ELSE @i := 1 END i 
      , @prev := student_id 
     FROM my_table x 
      , (SELECT @i:=1,@prev:='') vars 
     ORDER 
      BY student_id 
      , event_time DESC 
    ) n 
WHERE i <= 3 
ORDER 
    BY event_time; 
+0

О, мой ... прекрасный ответ. Именно то, что я искал. Мне нужно многому научиться в терминах операторов SQL haha. Спасибо, друг! –

+0

@AdrianoVieira Вы должны принять ответ, если вы его удовлетворены :) – EugZol

+0

Nice. Первый раз здесь, извините! = D. Ответ принят. Чем быстрее, тем лучше. = D –

0
select max(time), type, id 
from your table 
group by type, id 

должно работать. Если я вас понял, вам нужна последняя запись для каждой пары (тип, id), которую этот запрос будет получать.

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