Protossan
@Protossan
студент

Как найти максимальное число записей за неопределенный час?

Добрый вечер. Поставили мне задачу - в таблице "posts" с полями usrid | data | post | postid и большим числом записей за 4 года найти N пользователей, которые наиболее часто постили в неопределенный отрезок времени в 60 минут. Т.е. если разложить на пальцах - Вася постит от 20 до 100 сообщений в день, и максмум что у него выходило - 10 постов в час. В то же время Миша и Коля постят 1 раз в день по 30 и 40 постов в час, соответственно. Но иногда они постят по 5 постов в час, а иногда вообще не постят. Мне надо вывести в таблицу, например, Колю и Мишу, потому что они умудрялись запостить 30 и 40 постов в час. Все бы ничего, но понятие час не определено какими-то временными рамками. Это просто 60 минут из жизни - может с 15:48 до 16:48, а может с 19:02 до 20:02...

Начал я выбирать все записи с конца и сравнивать их с предыдущими, и отбрасывать те что имеют между собой боле часа времени. Но потом понял что это ерунда, ведь надо сравнивать каждый пост со всеми предыдущими за час, итак со сдвигом в -1 пока не достигну начала записей. ПРи наличии 4000 юзеров и более 80000 записей, я боюсь представить этот массив данных. Может кто-то скажет как можно реализовать попроще? И есть ли вообще решение такой задачи если временные рамки часа не определены?
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 1
Winsik
@Winsik
сис.админ, недопрограммист :)
вот под оракл: sqlfiddle.com/#!4/1a2436/1
CREATE TABLE T1
    ("IID" int, "DDT" date)
;

INSERT ALL 
    INTO T1 ("IID", "DDT")
         VALUES (2, to_date('2003-05-03 12:12', 'yyyy-mm-dd hh24:mi'))
    INTO T1 ("IID", "DDT")
         VALUES (1, to_date('2003-05-03 12:22', 'yyyy-mm-dd hh24:mi'))
    INTO T1 ("IID", "DDT")
         VALUES (1, to_date('2003-05-03 12:32', 'yyyy-mm-dd hh24:mi'))
    INTO T1 ("IID", "DDT")
         VALUES (2, to_date('2003-05-03 12:42', 'yyyy-mm-dd hh24:mi'))
    INTO T1 ("IID", "DDT")
         VALUES (1, to_date('2003-05-03 12:52', 'yyyy-mm-dd hh24:mi'))
    INTO T1 ("IID", "DDT")
         VALUES (2, to_date('2003-05-03 13:13', 'yyyy-mm-dd hh24:mi'))
    INTO T1 ("IID", "DDT")
         VALUES (2, to_date('2003-05-03 13:14', 'yyyy-mm-dd hh24:mi'))
    INTO T1 ("IID", "DDT")
         VALUES (1, to_date('2003-05-03 13:21', 'yyyy-mm-dd hh24:mi'))
    INTO T1 ("IID", "DDT")
         VALUES (2, to_date('2003-05-03 14:24', 'yyyy-mm-dd hh24:mi'))
SELECT * FROM dual
;


SELECT IID, MAX(ids) AS max_id
  FROM (
        SELECT IID , 
               COUNT(*) OVER (PARTITION BY IID 
                              ORDER BY DDT
                              RANGE INTERVAL '60' MINUTE PRECEDING) AS ids
          FROM T1
        )
 GROUP BY IID;


stackoverflow.com/questions/14434032/get-the-maxim...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы