powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Достать распределение
18 сообщений из 43, страница 2 из 2
Достать распределение
    #38748907
Стас0н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще говоря исходные данные выглядят как-то так:
Таблица с записями о заходе пользователей на определенный ресурс:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
+-----------+-----------------+-------------+------+
| adnest_id | visitor_id      | timeslot_id | num  |
+-----------+-----------------+-------------+------+
|         8 | 14441319829303 |        6032 |    1 |
|         8 | 14441319829303 |        6052 |    1 |
|         6 | 14441319829303 |        6080 |    1 |
|         6 | 16664540522788 |        6032 |    9 |
|         5 | 31051333527785 |        6080 |    1 |
+-----------+----------------+-------------+------+


Есть еще табличка, которая связывает поля timeslot и реальное время захода пользователя

Из всего этого мне нужно получить распределение количества пользователей на каждом ресурсе по частоте за определенный промежуток времени.
Что-то вроде этого:
Код: sql
1.
2.
3.
4.
site_ID       1-10    11-50 51-100
    ----------  ---   ---  ---
    8           967   576   856
    6           576   947   847



где "1-10", "11-50" - это типа интервалы частоты. Так, "967" - это количество пользователей, которые посетили ресурс "8" от 1 до 10 раз за определенный промежуток времени.

Так, я написал запрос, результат которого вот такая таблица (сайт, пользователь и его количество заходов на сайт за нужный мне промежуток времени):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
+-----------+---------------------+-------------------+
|  site_id  | visitor_id          | count(visitor_id) |
+-----------+---------------------+-------------------+
|         18 |  353389751327572831 |              1120 |
|         18 | 8248747651386193561 |              1005 |
|         18 | 1773132781390152736 |               957 |
|         18 |  501663501391419490 |               936 |
|        18 | 1231874741355575425 |               925 |
|         21 | 2078329811388561752 |               904 |
|         21 | 7565480111354343102 |               875 |
|         21 |  997915071394432214 |               870 |
|         21 | 2363204321364319637 |               869 |
|         1 |   17474831359576968 |               866 |
+-----------+---------------------+-------------------+


Так, у сайта 18, будет стоять 5 в графе "1-10", а в остальных 0. И так далее
...
Рейтинг: 0 / 0
Достать распределение
    #38749241
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас0нВообще говоря исходные данные выглядят как-то так:
Таблица с записями о заходе пользователей на определенный ресурс:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
+-----------+-----------------+-------------+------+
| adnest_id | visitor_id      | timeslot_id | num  |
+-----------+-----------------+-------------+------+
|         8 | 14441319829303 |        6032 |    1 |
|         8 | 14441319829303 |        6052 |    1 |
|         6 | 14441319829303 |        6080 |    1 |
|         6 | 16664540522788 |        6032 |    9 |
|         5 | 31051333527785 |        6080 |    1 |
+-----------+----------------+-------------+------+


Есть еще табличка, которая связывает поля timeslot и реальное время захода пользователя

Из всего этого мне нужно получить распределение количества пользователей на каждом ресурсе по частоте за определенный промежуток времени.
Что-то вроде этого:
Код: sql
1.
2.
3.
4.
site_ID       1-10    11-50 51-100
    ----------  ---   ---  ---
    8           967   576   856
    6           576   947   847



где "1-10", "11-50" - это типа интервалы частоты. Так, "967" - это количество пользователей, которые посетили ресурс "8" от 1 до 10 раз за определенный промежуток времени.

Так, я написал запрос, результат которого вот такая таблица (сайт, пользователь и его количество заходов на сайт за нужный мне промежуток времени):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
+-----------+---------------------+-------------------+
|  site_id  | visitor_id          | count(visitor_id) |
+-----------+---------------------+-------------------+
|         18 |  353389751327572831 |              1120 |
|         18 | 8248747651386193561 |              1005 |
|         18 | 1773132781390152736 |               957 |
|         18 |  501663501391419490 |               936 |
|        18 | 1231874741355575425 |               925 |
|         21 | 2078329811388561752 |               904 |
|         21 | 7565480111354343102 |               875 |
|         21 |  997915071394432214 |               870 |
|         21 | 2363204321364319637 |               869 |
|         1 |   17474831359576968 |               866 |
+-----------+---------------------+-------------------+


Так, у сайта 18, будет стоять 5 в графе "1-10", а в остальных 0. И так далее


приведите пример исходных данных -- 5-10-15 строчек ( одна таблица )
и конкретный ожидаемый результат (в табличном виде а не словами, одна таблица )
из ЕТИХ конкретных (5-10-15 строчек) исходных данных.
...
Рейтинг: 0 / 0
Достать распределение
    #38749839
Стас0н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, вот исходные данные:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
+-----------+---------------------+-------------------+
|  site_id  | visitor_id          | count(visitor_id) |
+-----------+---------------------+-------------------+
|         8 |  353389751327572831 |              1120 |
|         8 | 8248747651386193561 |              1005 |
|         8 | 1773132781390152736 |               957 |
|         8 |  501663501391419490 |               936 |
|         8 | 1231874741355575425 |               925 |
|         8 | 2078329811388561752 |               904 |
|         8 | 7565480111354343102 |               875 |
|         8 |  997915071394432214 |               870 |
|         8 | 2363204321364319637 |               869 |
|         8 |   17474831359576968 |               866 |
+-----------+---------------------+-------------------+



Результат:
Код: sql
1.
2.
3.
4.
site_ID    1-10  11-50   51-100
----------  ---   ---    ---
8           967   576    856
6           576   947    847
...
Рейтинг: 0 / 0
Достать распределение
    #38749905
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас0нХорошо, вот исходные данные:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
+-----------+---------------------+-------------------+
|  site_id  | visitor_id          | count(visitor_id) |
+-----------+---------------------+-------------------+
|         8 |  353389751327572831 |              1120 |
|         8 | 8248747651386193561 |              1005 |
|         8 | 1773132781390152736 |               957 |
|         8 |  501663501391419490 |               936 |
|         8 | 1231874741355575425 |               925 |
|         8 | 2078329811388561752 |               904 |
|         8 | 7565480111354343102 |               875 |
|         8 |  997915071394432214 |               870 |
|         8 | 2363204321364319637 |               869 |
|         8 |   17474831359576968 |               866 |
+-----------+---------------------+-------------------+



Результат:
Код: sql
1.
2.
3.
4.
site_ID    1-10  11-50   51-100
----------  ---   ---    ---
8           967   576    856
6           576   947    847



приведите пример исходных данных -- 5-10-15 строчек (одна таблица)
и конкретный ожидаемый результат (в табличном виде а не словами, одна таблица)
из ЕТИХ КОНКРЕТНЫХ (5-10-15 строчек) исходных данных.
...
Рейтинг: 0 / 0
Достать распределение
    #38750259
Стас0н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
+-----------+---------------------+-------------------+
|  site_id  | visitor_id          | count(visitor_id) |
+-----------+---------------------+-------------------+
|         8 |  353389751327572831 |               112 |
|         8 | 8248747651386193561 |               100 |
|         8 | 1773132781390152736 |                95 |
|         8 |  501663501391419490 |                93 |
|         8 | 1231874741355575425 |                92 |
|         8 | 2078329811388561752 |                90 |
|         8 | 7565480111354343102 |                87 |
|         8 |  997915071394432214 |                87 |
|         8 | 2363204321364319637 |                86 |
|         8 |   17474831359576968 |                86 |
+-----------+---------------------+-------------------+



результат:
Код: sql
1.
2.
3.
site_ID    1-10  11-50  51-100  101-200
----------  ---   ---   ---       ---
8            0      0     9       1
...
Рейтинг: 0 / 0
Достать распределение
    #38750528
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас0н,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select
  z.site_id, 
  sum(z.cnt between 1 and 10) as col001_010,
  sum(z.cnt between 11 and 50) as col011_050,
  sum(z.cnt between 51 and 100) as col051_100,
  sum(z.cnt between 101 and 200) as col101_200
from
(
select
  u.site_id, 
  -- visitor_id,
  count(*) cnt
from
  user_site_visits u
group by 
  u.site_id, 
  u.visitor_id
) z
group by 
  z.site_id
...
Рейтинг: 0 / 0
Достать распределение
    #38750748
Стас0н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю! Не совсем так, но я понял как нужно переделать запрос.

Скажите, а можно оформить вывод так же, только чтобы интервалы частотные хранились, например, в temporary table?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create temporary table ranges (
   s int not null,
   e int not null,
   range_name varchar(15) not null
);

insert into ranges (s, e) values
   (0, 100),
   (101, 200),
   (201, 300),
   (301, 1000),
   (1001, 1500),
   (1501, 10000)
;



Просто, если нужно будет изменить интервал, то придется менять целую строку в запросе, а хочется, чтобы нужно было поменять только два числа в Temporary table - это возможно?
...
Рейтинг: 0 / 0
Достать распределение
    #38750955
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас0н,

напрямую -- врядли,

варинат, который я знаю --
динамически генерировать СКЛ на
клиентской стороне или в хранимой процедуре.
...
Рейтинг: 0 / 0
Достать распределение
    #38750959
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...если вы создаете всякие дрил-доуны репорты,
то, как вариант, подумайте про мулти-дименшин
репорты, ОЛАП, петахо, мсскл сервер и куча других.
...
Рейтинг: 0 / 0
Достать распределение
    #38750975
Стас0н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю, да, стоит посмотреть в ту сторону, как только тут закончу.

Если кому интересно, то последний вопрос по тебе здесь
...
Рейтинг: 0 / 0
Достать распределение
    #38751000
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас0нПросто, если нужно будет изменить интервал, то придется менять целую строку в запросе, а хочется, чтобы нужно было поменять только два числа в Temporary table - это возможно?Идеального варианта нет, т.к. в MySQL в любом запросе может быть только определенное количество результирующих полей, их перечень не может меняться в процессе выполнения запроса.

Неидеальные варианты:
1) Фиксированное количество диапазонов, границы хранить в таблице.
2) Произвольное количество диапазонов, но результат получать в одном поле в виде конкатенации (см. GROUP_CONCAT).
3) Не "разворачивать" диапазоны в горизонталь в запросе, а разворачивать уже на клиенте (удобно, если в итоге получается HTML или типа того).
4) Генерировать SQL на основе данных из таблицы с границами диапазонов.
...
Рейтинг: 0 / 0
Достать распределение
    #38751038
Стас0н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftСтас0нПросто, если нужно будет изменить интервал, то придется менять целую строку в запросе, а хочется, чтобы нужно было поменять только два числа в Temporary table - это возможно?Идеального варианта нет, т.к. в MySQL в любом запросе может быть только определенное количество результирующих полей, их перечень не может меняться в процессе выполнения запроса.

Неидеальные варианты:
1) Фиксированное количество диапазонов, границы хранить в таблице.
2) Произвольное количество диапазонов, но результат получать в одном поле в виде конкатенации (см. GROUP_CONCAT).
3) Не "разворачивать" диапазоны в горизонталь в запросе, а разворачивать уже на клиенте (удобно, если в итоге получается HTML или типа того).
4) Генерировать SQL на основе данных из таблицы с границами диапазонов.

Я согласен тут полностью. Среди неидеальных вариантов хочется реализовать ваш п.1. Можете помочь в этом?
...
Рейтинг: 0 / 0
Достать распределение
    #38751109
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас0нСреди неидеальных вариантов хочется реализовать ваш п.1. Можете помочь в этом?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create temporary table tranges (
   rn int unsigned auto_increment not null
   s int not null,
   e int not null
);
insert into ranges (s, e) values <...>;

select
 z.site_id
 ,sum(t.rn=1) as cnt_1
 <...>
 ,sum(t.rn=N) as cnt_N
from
(<...>) z
join tranges t on z.cnt between t.s and t.e
group by 1

Правда, динамические названия столбцов в этом варианте не получится сделать. Придётся дополнительно дёргать таблицу диапазонов с клиента.
...
Рейтинг: 0 / 0
Достать распределение
    #38751256
Стас0н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю, но проблема остается актуально - если изменится число запросов, то все-равно придется переписывать вот этот момент:
Код: sql
1.
2.
3.
4.
5.
select
 z.site_id
 ,sum(t.rn=1) as cnt_1
 <...>
 ,sum(t.rn=N) as cnt_N
...
Рейтинг: 0 / 0
Достать распределение
    #38751399
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас0нБлагодарю, но проблема остается актуально - если изменится число запросов, то все-равно придется переписывать вот этот момент:
Код: sql
1.
2.
3.
4.
5.
select
 z.site_id
 ,sum(t.rn=1) as cnt_1
 <...>
 ,sum(t.rn=N) as cnt_N

Вы же хотели вариант по пункту 1 - вам его предложили.
Не нравится - выбирайте другой вариант.
...
Рейтинг: 0 / 0
Достать распределение
    #38751413
Стас0н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виноват, подумал, что контекст предыдущих постов подскажет, что не хочется убирать/добавлять строки в случае, если нужно будет менять интервалы
...
Рейтинг: 0 / 0
Достать распределение
    #38751436
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас0нпроблема остается актуально - если изменится число запросовкакая задача
miksoft1) Фиксированное количество диапазонов, границы хранить в таблице.такое и решение
Стас0нконтекст предыдущих постов подскажетсм.выше
...
Рейтинг: 0 / 0
Достать распределение
    #38751440
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вообще - берёте вариант 4, пишете под него хранимку, profit
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Достать распределение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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