Средняя скорость ответа юзера

198
16 июля 2018, 01:30

Есть чат между оператором и клиентом.

Все сообщения хранятся в таблице.

CREATE TABLE IF NOT EXISTS `message` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `chatId` INT NOT NULL DEFAULT -1,
  `type` VARCHAR(50) NULL DEFAULT 'CLIENT',
  `message` LONGTEXT NULL,
  `time` VARCHAR(255) NULL,
  `date` VARCHAR(255) NULL,
  `status` TINYINT(1) NULL DEFAULT 0,
  `created` TIMESTAMP(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
ENGINE = InnoDB;

Нужно определить среднее время ответа оператора клиенту. Каким образом это лучше сделать? Выгрузить все сообщения в цикле обработать? (тут свою уже нюансы ибо нужно учитывать сообщение клиента а после ответ оператора) Или можно сделать запросом?

Answer 1

Для MySql, если игнорировать условия в колонках кроме type, и использовать временные таблицы для упрощения.

Создание таблицы и заполнение данными:

-- MySQL dump 10.13  Distrib 5.7.17, for Win64 (x86_64)
--
-- Host: localhost    Database: world
-- ------------------------------------------------------
-- Server version   5.7.21-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `message`
--
DROP TABLE IF EXISTS `message`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `message` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `chatId` int(11) NOT NULL DEFAULT '-1',
  `type` varchar(50) DEFAULT 'CLIENT',
  `message` longtext,
  `time` varchar(255) DEFAULT NULL,
  `date` varchar(255) DEFAULT NULL,
  `status` tinyint(1) DEFAULT '0',
  `created` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `message`
--
LOCK TABLES `message` WRITE;
/*!40000 ALTER TABLE `message` DISABLE KEYS */;
INSERT INTO `message` VALUES (1,1,'CLIENT','111111',NULL,NULL,0,'2018-06-15 09:56:32.654668'),(2,1,'OPERATOR','222222',NULL,NULL,0,'2018-06-15 09:57:14.252800'),(3,2,'CLIENT','333333',NULL,NULL,0,'2018-06-15 09:59:37.853248'),(4,2,'OPERATOR','44444',NULL,NULL,0,'2018-06-15 09:59:51.799293');
/*!40000 ALTER TABLE `message` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2018-06-15 13:01:31

Запросы

DROP TABLE IF EXISTS T0;
DROP TABLE IF EXISTS T1;
-- первое сообщение в чате от пользователя
-- если первое сообщение не от пользователя, то не включается в результат
CREATE TEMPORARY TABLE T0
(
select
    M0.`id`,
    M0.`chatId`,
    M0.`created`
from `message` as M0 
    join (
        select 
            `chatId` as `chatId`,
            min(`created`) as `created`
        from 
            `message`
        group by 
            `chatId`
        )
    as M1 on M0.chatId = M1.chatId and M0.`created` = M1.`created`
where 
    M0.type = 'CLIENT'      -- клиент первый
)
;   
-- первое сообшение в чате от оператора (может быть вторым или больше, если пользователь написал оператору несколько раз)
CREATE TEMPORARY TABLE T1
(
select
    M0.`chatId`,
    M0.`created`
from `message` as M0 
    join (
        select 
            M7.`chatId` as `chatId`,
            min(M7.`created`) as `created`
        from 
            `message` as M7
            join T0 on M7.chatId = T0.chatId
        where 
            T0.id != M7.id              -- исключили первую запись
            and M7.type != 'CLIENT'     -- не клиент
        group by 
            M7.`chatId`
        )
    as M1 on M0.chatId = M1.chatId and M0.`created` = M1.`created`
)
;   
-- сообщения , оставшиеся без ответа, игнорируем
select 
    AVG(T1.`created` - T0.`created`) as `response_avg`
from T0 
    join T1 on T0.`chatId` = T1.`chatId`
READ ALSO
Выключить музыку на будильник. AlarmManager cancel()

Выключить музыку на будильник. AlarmManager cancel()

После нажатия первой кнопки включатся музыка по AlarmManagerВопрос, как выключить запущенную музыку при помощи второй кнопки? Метод cancel() не помогает...

188
length и length() в Java

length и length() в Java

Почему при получении количества элементов определяющих размер массива мы используем arraylength, а при получении количества элементов строки...

180
Фон внутри текста

Фон внутри текста

Как сделать фон, который находится в тексте? Текст TEKST отрисован картинкой, к примеру в png

196
Вывод рандомных чисел в chart js

Вывод рандомных чисел в chart js

Есть в графике labels ,в каждом из них 2 столбика , один столбик выводит рандомные числа ,а на второй не знаю как прописать скриптПомогите пожалуйста

171