powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сложный запрос - помогите придумать!
3 сообщений из 3, страница 1 из 1
Сложный запрос - помогите придумать!
    #32152093
Sergey Martynov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться. Нужно написать сложный запрос. Вот ситуация:

Для обработки статистики лог веб-сервера складыватся в табличку, после чего с помощью хитрых запросов формируется таблица со статистикой.
Вот такой запрос это делает:

INSERT INTO server_day SELECT '$YESTERDAY'::date as date,
req_url,
count(*) as reqs,count(DISTINCT host_ip) as hosts
FROM stat_tmp WHERE date(vers)='$YESTERDAY'::date
GROUP BY req_url ;

Видно, что считается статистика хитов и хостов.

Теперь надо дописать такую фичу: в таблице stat_tmp есть есть поле login, в котором для каждого запроса хранится логин пользователя, если он авторизован. В таблицу server_day я добавил поля reqs_u и hosts_u - в них нужно сложить кол-во хитов и хостов авторизованных пользователей, но не всех, а отвечающих особому критерию. Критерий можно просчитать заранее, и сделать таблицу users_tmp с одним полем - login - и в нее сложить логины нужных пользователей.

То есть задача сводится к следующей:

Написать запрос типа такого:

INSERT INTO server_day SELECT '$YESTERDAY'::date as date,
req_url,
count(*) as reqs,count(DISTINCT host_ip) as hosts,
count( ЧТО_ТО_ХИТРОЕ_1 ) as reqs_f,
count( ЧТО_ТО_ХИТРОЕ_2 ) as hosts_f
FROM stat_tmp WHERE date(vers)='$YESTERDAY'::date
GROUP BY req_url ;

надо придумать ЧТО_ТО_ХИТРОЕ_1 и ЧТО_ТО_ХИТРОЕ_2, так чтобы оно смотрело в поле login таблицы stat_tmp и выбирало только те записи, в которых login встречается в таблице users_tmp.
...
Рейтинг: 0 / 0
Сложный запрос - помогите придумать!
    #32152223
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧТО_ТО_ХИТРОЕ_1 и ЧТО_ТО_ХИТРОЕ_2 подразумевают subquery.
Но сначало бы немешало полное опимание таблиц:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Create Table tbl_name1 (
id_field_name11 type [constraints| primary key],
field_name21 type,
...
);

Create Table tbl_name2 (
id_field_name12 type [constraints| primary key],
field_name22 type,
...
);



"чтобы оно смотрело в поле login таблицы stat_tmp и выбирало только те записи, в которых login встречается в таблице users_tmp."
subquery:
Код: plaintext
Select a.id_field_name11,b.id_field_name12, field_name21, field_name22 from tbl_name1 a, tbl_name2  b where a.id_field_name1,b.id_field_name2;
...
Рейтинг: 0 / 0
Сложный запрос - помогите придумать!
    #32175395
Rin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rin
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 --Вариант с join-ом
 
INSERT INTO server_day
SELECT '$YESTERDAY'::date as date, s.req_url,
       count(*) as reqs,
       count(DISTINCT s.host_ip) as hosts,
       count(u.login) as reqs_f,
       count(DISTINCT CASE WHEN u.login is not null THEN s.host_ip ELSE null END) as hosts_f
FROM stat_tmp s
LEFT OUTER JOIN users_tmp u ON u.login=s.login
WHERE s.vers::date='$YESTERDAY'::date
GROUP BY s.req_url;

 --2-ой вариант
 
INSERT INTO server_day
SELECT '$YESTERDAY'::date as date, s.req_url,
       count(*) as reqs,
       count(DISTINCT s.host_ip) as hosts,
       count(CASE WHEN exists(select  1  from users_tmp u where u.login=s.login limit  1 ) THEN s.login ELSE null END) as reqs_f,
       count(DISTINCT CASE WHEN exists(select  1  from users_tmp u where u.login=s.login limit  1 ) THEN s.host_ip ELSE null END) as hosts_f
FROM stat_tmp s
WHERE s.vers::date='$YESTERDAY'::date
GROUP BY s.req_url;


Надо проверить, но мне больше нравиться 1-ый вариант
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сложный запрос - помогите придумать!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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