Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

kueri mysql - data CDR panggilan serentak puncak

Yang ini seharusnya bekerja, tetapi merupakan pembunuh kinerja yang nyata!

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

memberikan jawaban yang benar untuk data contoh Anda. Begini, cara kerjanya:

  • Bagian terdalam (a.calldate<=b.calldate AND (UNIX_TIMESTAMP(a.calldate)+a.duration)>=UNIX_TIMESTAMP(b.calldate) ...) menghitung persimpangan:Dua panggilan tumpang tindih, jika titik awal satu panggilan berada pada atau setelah titik awal panggilan lainnya dan pada atau sebelum titik akhir panggilan tersebut
  • Menggabungkan sendiri tabel panggilan menemukan semua tumpang tindih,
  • tetapi dengan masalah:Penggabungan diri menemukan putaran yang tumpang tindih antara baris 1 dan 2, tetapi yang lain dengan baris 2 dan 1. Jika lebih dari dua panggilan tumpang tindih, akan membosankan untuk menyelesaikannya
  • Sekarang karena data Anda berisi ID unik numerik, kami dapat menggunakan ini untuk memfilter duplikat, rangkap tiga, dll. ini dilakukan oleh AND a.uniqueid>b.uniqueid pemilih dan GROUP BY a.uniqueid , yang hanya membuat panggilan dengan uniqueid terkecil melihat semua panggilan bersamaan, yang lain melihat lebih sedikit
  • Menggunakan MAX() tentang ini di kueri luar menyaring catatan ini
  • Kami membutuhkan +1 untuk mendapatkan jumlah panggilan puncak:Panggilan dengan 2 panggilan bersamaan berarti jumlah puncak 3

SQLfiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bisakah Anda mengindeks subquery?

  2. tarik-turun yang diisi secara dinamis; $_POST mengembalikan kesalahan

  3. Bagaimana Anda bergabung di tabel yang sama, dua kali, di mysql?

  4. PDO bindParam untuk tanggal tidak berfungsi

  5. pilih baris dalam sql dengan tanggal terbaru untuk setiap ID yang diulang beberapa kali