MySQL: как сгруппировать данные за час и получить последний час - PullRequest
9 голосов
/ 26 мая 2011

Я пытаюсь сделать запрос, который выбирает данные за hour, но вместо обычной группы по часам я хочу сузить его и получить только latest час - то есть самые новые данные за этот час.С изображением, показанным ниже, я хотел получить строки с красными прямоугольниками.Если вы заметите, первая красная строка - 10:59:51, что означает, что это единственная строка в пределах 10:00:00 и 10:59:59.Для остальных строк, которые находятся на 12:00 и выше, я хотел получить 12:37:14, потому что это последний или самый новый для этого диапазона часов.

enter image description here

У меня естьпростой запрос, который группирует данные по hour с использованием HOUR(), например:

SELECT userid, username, date_created
FROM user_accounts 
WHERE date_created >= '2009-10-27 00:00:00' AND date_created < '2009-10-27 23:59:59'
GROUP BY HOUR(date_created)

Запрос, однако, просто группирует его по часам 10 и 12, что возвращает идентификатор 24 и25 - но мне нужно было id 24 и 28.Есть идеи?

Ответы [ 5 ]

19 голосов
/ 26 мая 2011

Попробуйте

SELECT  f.*
FROM    (
        SELECT  MAX(UNIX_TIMESTAMP(date_created)) AS mts
        FROM  user_accounts 
        GROUP BY HOUR(date_created)
        ) s
JOIN    user_accounts  f
ON      UNIX_TIMESTAMP(date_created) = s.mts
WHERE  DATE(date_created) = '2009-10-27'
5 голосов
/ 26 мая 2011

Может это сработает?

SELECT userid, username, date_created
FROM user_accounts 
WHERE userid IN (
  SELECT MAX(userid)
  FROM user_accounts 
  WHERE date_created >= '2009-10-27 00:00:00' AND date_created < '2009-10-27 23:59:59'
  GROUP BY HOUR(date_created)
)
1 голос
/ 26 мая 2011

Я бы предположил, что вы также захотите это по дням, если он охватывает несколько дней, в противном случае max () на час может дать вам что-то за неделю назад с одним часом против трех дней назад с другим, а текущий день с еще один ... Это все, если вы вышли за рамки своего предложения WHERE, конкретно ограничивающего ваш диапазон одного дня. Это не конкретный пользователь, которого вы хотите, но кто бы ни занимался последними действиями в течение этого часа ... мог быть одним и тем же человеком, каждый раз мог быть совершенно другим. Я использую конкретную дату как часть моего группового теста на тот случай, если вы когда-нибудь захотите охватить диапазон дат, но вы также можете его убрать ...

select STRAIGHT_JOIN
       ui.userid,
       ui.username,
       ui.date_created
   from 
       ( select
               date( date_created ),
               hour( date_created ),
               max( date_created ) as LastPerHour
            from
               user_accounts
            where
               date( date_created ) = '2009-10-27'
            group by
               date( date_created), 
               hour( date_created )) PreQuery
      join user_accounts ui
         on PreQuery.LastPerHour = ui.date_created

Опять же, я также включил дату в качестве группировки, если вы хотите охватить несколько дней, просто убедитесь, что ваша таблица имеет индекс для date_created самостоятельно ... или хотя бы в первой позиции индекса.

0 голосов
/ 27 февраля 2018

Я использую это решение

select date(PROCESS_DATE),hour(PROCESS_DATE),EVENT,COUNT(*) from statistics group by EVENT,date(PROCESS_DATE),time(PROCESS_TIME) order by 1 desc, 2 desc limit 1;

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 26 мая 2011

Вы имеете в виду один час от СЕЙЧАС или последний полный час?Если это последний полный час, что-то вроде этого может сработать?

SELECT userid, username, date_created
FROM user_accounts 
WHERE HOUR(date_created) = (SELECT HOUR(date_created) FROM user_accounts ORDER BY date_created DESC LIMIT 1);

РЕДАКТИРОВАТЬ: Аааа, теперь я думаю, что я получаю то, что вы хотите ... Последняя добавленная запись в каждый данный час между диапазонами дат?*

Если это так, то запрос Кодлера - то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...