SQL-запрос для определения пика количества видеопотоков - PullRequest
0 голосов
/ 05 апреля 2019

Я получил следующий вопрос SQL на собеседовании:

Table:
  customer_id,
  video_id,
  start_time,
  end_time

Вопрос в том, чтобы найти пиковое время потокового видео. Интервьюер не согласился идти с часовым окном.

Лично я сделал бы это в коде, скользящем через односекундное окно во времени, и нашел бы максимум, но я не могу писать каждую секунду SQL-оператор CASE.

Буду признателен за любую подсказку?

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Если вы просто хотите получить пик, разбейте данные на «два» - и накапливайте сумму.

Если вы просто хотите получить пик для всех видео:

with t as (
      select start_time as time, 1 as inc
      from <table> t
      union all
      select end_time, -1 as inc
      from <table> t
     )
select time, sum(inc),
       sum(sum(inc)) over (order by time) as concurrent
from t
group by time
order by concurrent desc
fetch first 1 row only;

Это можно изменить, чтобы получить максимум для каждого видео.

0 голосов
/ 05 апреля 2019

Интересный вызов.Вы не предоставили DDL и образцы данных, поэтому я не могу их протестировать, но общее направление, которое я бы выбрал, - это создать производную таблицу для каждой минуты в пределах желаемого диапазона, присоединить ее к таблице, которую вы описали, на основеминуты в пределах диапазона потоковой передачи, а затем подсчитать строки.Если вы используете, например, PostgreSQL и ограничиваетесь январем 2018 года, вы можете сделать что-то вроде:

WITH All_Minutes
AS
(
SELECT Actual_Minute
FROM generate_series('2018-01-01 00:00'::timestamp, '2018-02-01 00:00', interval '00:01:00') AS TS(Actual_Minute)
),
SELECT Actual_Minute, COUNT(*) AS Number_Of_Streams
FROM   Your_Table AS YT
       INNER JOIN
       All_Minutes AS AM
       ON AM.Actual_Minute BETWEEN YT.start_Time and YT.end_time
GROUP BY Actual_Minute
ORDER BY Number_Of_Streams DESC      
LIMIT 1;

HTH

...