Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Группировка с условием по полю / 6 сообщений из 6, страница 1 из 1
02.06.2018, 15:28
    #39654353
noize
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с условием по полю
Здравствуйте. Помогите пожалуйста с SQL запросом. Имеется таблица для статиститки звонков такого вида

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE `stat` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key column',
`guid` varchar(255) DEFAULT NULL,
`sip_call_id` varchar(512) DEFAULT NULL,
`cli` char(32) NOT NULL,
`cld` char(32) NOT NULL,
`setup_time` datetime NOT NULL,
`connect_time` datetime NOT NULL,
`duration` mediumint(8) unsigned NOT NULL DEFAULT '0',
`acctstatus` enum('Start','Stop') NOT NULL DEFAULT 'Stop',
`call_type` enum('Incoming','Outgoing','Internal','BlackListed','InterOrg') NOT NULL DEFAULT 'Internal',
`dev_type` varchar(25) NOT NULL DEFAULT 'pbx',
`caller_name` varchar(100) DEFAULT NULL COMMENT 'Caller name',
`called_name` varchar(100) DEFAULT NULL COMMENT 'Called name',
`month_num` int(2) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`,`month_num`),
KEY `connect_time` (`connect_time`),
KEY `acctstatus` (`acctstatus`),
KEY `call_type` (`call_type`),
KEY `month_num` (`month_num`),
KEY `sip_call_id` (`sip_call_id`(255)),
KEY `k_guid` (`guid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8



Где guid - это идентификатор всего звонка, а sip_call_id - это идентификатор части звонка, т.е. в таблице есть несколько записей с одним sip_call_id и у них у всех guid одинаковый.

Раньше на sip_call_id внимания не обращали и выбирали примерно таким запросом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
    `stat`.`sip_call_id`,
    `stat`.`cli`,
    `stat`.`setup_time`,
    `stat`.`connect_time`,
    MAX(`stat`.`duration`),
    `stat`.`acctstatus`,
    `stat`.`call_type`,
    `stat`.`dev_type`,
    COUNT(`stat`.`sip_call_id`)
FROM `stat`
WHERE
    `guid` = '<guid>'
GROUP BY `setup_time`, `CLI`, `CLD`, `dev_type`, `call_type`, `called_name`;



Теперь же нужно в выборке получать тот sip_call_id, у которого длительность(duration) была больше.

Вот пример того, что возвращает запрос выше:
Код: sql
1.
2.
3.
4.
5.
+--------------------------------------+-----+---------------------+---------------------+------------------------+------------+-----------+----------+-----------------------------+
| sip_call_id                          | cli | setup_time          | connect_time        | MAX(`stat`.`duration`) | acctstatus | call_type | dev_type | COUNT(`stat`.`sip_call_id`) |
+--------------------------------------+-----+---------------------+---------------------+------------------------+------------+-----------+----------+-----------------------------+
| fd9db4d1-31bc-4a83-bb84-6ad82b12bc01 | 101 | 2018-06-02 10:10:13 | 2018-06-02 10:10:13 |                      4 | Stop       | Internal  | pbx      |                           3 |
+--------------------------------------+-----+---------------------+---------------------+------------------------+------------+-----------+----------+-----------------------------+


А вот что есть всего в таблице по данному звонку
Код: sql
1.
2.
3.
4.
5.
6.
7.
+--------------------------------------+-----+---------------------+---------------------+------------+-----------+----------+
| sip_call_id                          | cli | setup_time          | connect_time        | acctstatus | call_type | dev_type |
+--------------------------------------+-----+---------------------+---------------------+------------+-----------+----------+
| fd9db4d1-31bc-4a83-bb84-6ad82b12bc01 | 101 | 2018-06-02 10:10:13 | 2018-06-02 10:10:13 | Stop       | Internal  | pbx      |
| 4724b7f2-742c-474d-8737-40dad65c1319 | 101 | 2018-06-02 10:10:13 | 2018-06-02 10:10:14 | Start      | Internal  | pbx      |
| 4724b7f2-742c-474d-8737-40dad65c1319 | 101 | 2018-06-02 10:10:13 | 2018-06-02 10:10:14 | Stop       | Internal  | pbx      |
+--------------------------------------+-----+---------------------+---------------------+------------+-----------+----------+



Т.е. в сжатом виде у меня должен быть sip_call_id 4724b7f2-742c-474d-8737-40dad65c1319, т.к. у него длительность 4, а я получаю fd9db4d1-31bc-4a83-bb84-6ad82b12bc01

Впорос: как задать дополнительное условие для поля, чтобы оно выбиралось в зависимости от другого поля в сгруппированном запросе?
...
Рейтинг: 0 / 0
02.06.2018, 15:48
    #39654356
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с условием по полю
Если я правильно понял задачу, то как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
    `stat`.`sip_call_id`,
    `stat`.`cli`,
    `stat`.`setup_time`,
    `stat`.`connect_time`,
    `stat`.`duration`,
    `stat`.`acctstatus`,
    `stat`.`call_type`,
    `stat`.`dev_type`,
    COUNT(`stat`.`sip_call_id`)
FROM `stat`
WHERE
    `guid` = '<guid>'
ORDER BY duration DESC
LIMIT 1

Получите все поля из той записи, где duration наибольший.
...
Рейтинг: 0 / 0
02.06.2018, 15:51
    #39654357
noize
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с условием по полю
miksoft,

Не совсем так. Данные нужно сгруппировать по полям
Код: sql
1.
`setup_time`, `CLI`, `CLD`, `dev_type`, `call_type`, `called_name`


но поле sip_call_id взять из той части сгруппированных данных, в которых duration наибольший.
...
Рейтинг: 0 / 0
02.06.2018, 17:49
    #39654373
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с условием по полю
noizeДанные нужно сгруппировать по полямЗачем? Они могут различаться в пределах одного guid?

Кстати, в моем варианте надо выкинуть строчку с COUNT, она осталась от копирования.
...
Рейтинг: 0 / 0
03.06.2018, 12:16
    #39654462
noize
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с условием по полю
miksoftОни могут различаться в пределах одного guid?
Да, в рамках одного guid может быть несколько одинаковых sip_call_id
...
Рейтинг: 0 / 0
03.06.2018, 12:45
    #39654468
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с условием по полю
noize,

Т.е. в результате нужно получить несколько записей с конкретным значением guid и с разными значениями полей sip_call_id, `setup_time`, `CLI`, `CLD`, `dev_type`, `call_type`, `called_name`?

Лучше приведите максимально расширенный реалистичный пример исходных данных и желаемого результата.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Группировка с условием по полю / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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