Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчет записей подряд. / 10 сообщений из 10, страница 1 из 1
05.05.2016, 18:22
    #39230254
MovieClip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей подряд.
Здравствуйте. Хочу подсчитать, сколько дней подряд заходит пользователь. Есть таблица, в которой каждый визит пишется в формате DATETIME, за день визитов может быть сколько угодно. Возможно ли такое сделать средствами SQL?
Например, если визиты
2016-05-05 18:21:00
2016-05-05 18:21:00
2016-05-04 18:21:00
2016-05-03 18:21:00
2016-05-03 18:21:00
2016-05-01 18:21:00
то результат запроса будет 3, т.к. пользователь только 3 дня подряд зашел, 2 мая он не заходил.
...
Рейтинг: 0 / 0
06.05.2016, 00:54
    #39230447
MikkiMouse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей подряд.
MovieClip,

Можно, вот типа так - в лоб
Код: sql
1.
2.
3.
4.
5.
6.
SELECT MIN(t1.id), DATE(t1.some_date), COUNT(t2.some_date) AS _less, COUNT(t3.some_date) AS _more
FROM dates t1
LEFT JOIN dates t2 ON DATE(DATE_SUB(t1.some_date, INTERVAL 1 DAY)) = DATE(t2.some_date)
LEFT JOIN dates t3 ON DATE(DATE_ADD(t1.some_date, INTERVAL 1 DAY)) = DATE(t3.some_date)
GROUP BY DATE(t1.some_date)
HAVING _less + _more > 0
...
Рейтинг: 0 / 0
06.05.2016, 04:53
    #39230460
Подсчет записей подряд.
MovieClip,

структуру таблицы подробнее опиши. какие ещё поля в ней есть, кроме поля с дата-временем?
...
Рейтинг: 0 / 0
06.05.2016, 05:08
    #39230462
Подсчет записей подряд.
MovieClip,

опять же, непонятно - если пользователь вначале три дня подряд заходил, после пару дней пропустил, опять три дня заходил, день пропустил, а затем заходил подряд 5 дней. То какой результат должен быть в итоге? три строки - 3, 3 и 5 (все сплошные интервалы захождения, не короче заданного числа дней)? или только одна строка - 5 (максимальный сплошной интервал вхождений пользователя)
...
Рейтинг: 0 / 0
06.05.2016, 09:00
    #39230511
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей подряд.
Добрый Э - Эх,

а может быть и 11 - общее количество дней в периодах "сплошных заходов" :)
...
Рейтинг: 0 / 0
06.05.2016, 21:18
    #39231122
MovieClip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей подряд.
Добрый Э - Эх,
последний результат, т.е. кол-во заходов подряд на текущий день, включая его. Не захоидл вчера - результат 1, т.к. только сегодня заходил, заходил только вчера и сегодня - результат два, то есть результаты после разрыва не нужны. Надеюсь, понятно сказал.
...
Рейтинг: 0 / 0
06.05.2016, 22:24
    #39231155
Подсчет записей подряд.
select count(*) from
(
select date(`dt`) as d_
from `dates`,
(select @a:="2016-05-05") `now` -- стартовая дата
group by d_
having if(@a = d_, @a := @a - interval 1 day, NULL) is not null
order by d desc
) subq;
...
Рейтинг: 0 / 0
06.05.2016, 22:28
    #39231157
Подсчет записей подряд.
Пардон, поторопился
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select count(*) from
(
  select date(`dt`) as d_
   from `dates`,
   (select @a:="2016-05-05") `now`  -- стартовая дата
  group by d_
  having if(@a = d_, @a := @a - interval 1 day, NULL) is not null
  order by `dt` desc
) subq;
...
Рейтинг: 0 / 0
09.05.2016, 14:24
    #39231796
lamer yuga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей подряд.
MovieClip, наверное, как-то так...
За синтаксисом в хелп лезть лениво, преобразование datetime в date взял от ms sql.
Таблица CALENDAR неожиданно содержит... все дни от царя Гороха до ближайшего оборзимого будущего, даже возможно с нагрузкой до производственного календаря...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select
    u.user
  , max(c.`date`) prev_not_enter
  , u.last_entered_date
from(
  select v.user, convert(date,max(v.`datetime`)) last_entered_date
  from visits v
  group by v.user
  -- или вместо группировки
  -- where v.user=1
  )u
join calendar c on c.`date`<u.last_entered_date
  and not exists(
    select *
    from visits p
    where p.user=u.user -- поиск в VISITS по индексу (user, datetime)
      and p.`datetime` between p.`date` and p.`date` +interval 1 day - interval 1 mcs
    )
group by u.user
...
Рейтинг: 0 / 0
09.05.2016, 14:28
    #39231801
lamer yuga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей подряд.
Там алиас календаря указал неверно, но по контексту легко поправить.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчет записей подряд. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]