Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

consulta mysql - dados de CDR de chamadas simultâneas de pico


Este deve funcionar, mas é um verdadeiro assassino de desempenho!
SELECT
  calldate,
  MAX(concurrent)+1 AS peakcount
FROM (
    SELECT
      DATE(a.calldate) as calldate,
      COUNT(b.uniqueid) AS concurrent
    FROM cdr AS a, cdr AS b
    WHERE  
      a.calldate BETWEEN '2013-11-08 00:00:00' AND '2013-11-13 23:59:59'
      AND (
        (a.calldate<=b.calldate AND (UNIX_TIMESTAMP(a.calldate)+a.duration)>=UNIX_TIMESTAMP(b.calldate))
        OR (b.calldate<=a.calldate AND (UNIX_TIMESTAMP(b.calldate)+b.duration)>=UNIX_TIMESTAMP(a.calldate))
      )
      AND a.uniqueid>b.uniqueid
    GROUP BY a.uniqueid
  ) AS baseview
GROUP BY calldate

fornece as respostas corretas para seus dados de exemplo. Aqui está, como funciona:
  • A parte mais interna (a.calldate<=b.calldate AND (UNIX_TIMESTAMP(a.calldate)+a.duration)>=UNIX_TIMESTAMP(b.calldate) ...) calcula a interseção:Duas chamadas se sobrepõem, se o ponto inicial de uma chamada estiver no ou após o ponto inicial da outra chamada e no ou antes do ponto final dessa chamada
  • A união automática das tabelas de chamadas encontra todas as sobreposições,
  • mas com um problema:a autojunção encontra uma sobreposição entre as linhas 1 e 2, mas outra com as linhas 2 e 1. Se mais de duas chamadas se sobrepuserem, é tedioso resolver isso
  • Agora, como seus dados contêm um ID numérico exclusivo, podemos usá-lo para filtrar essas duplicatas, triplicadas etc. Isso é feito pelo AND a.uniqueid>b.uniqueid seletor e GROUP BY a.uniqueid , que faz com que apenas a chamada com o menor uniqueid veja todas as chamadas simultâneas, as outras vejam menos
  • Usando MAX() sobre isso na consulta externa filtra este registro
  • Precisamos do +1 para obter a contagem de pico de chamadas:uma chamada com 2 chamadas simultâneas significa uma contagem de pico de 3

SQLfiddle