我在求职面试中遇到以下SQL问题:
Table:
customer_id,
video_id,
start_time,
end_time
问题是要找到流视频的高峰时间。面试官不接受一个小时的窗口。
我个人会在这段时间内滑动一秒钟的窗口并找到最大值的代码中做到这一点,但是我无法每秒编写一条SQL CASE语句。
希望得到任何提示吗?
答案 0 :(得分:1)
如果只想要峰值,则将数据分成“两个”-并进行累加。
如果您只想要所有视频的峰值:
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;
可以修改此值以获取每个视频的峰值。
答案 1 :(得分:0)
有趣的挑战。 您没有提供DDL和样本数据,所以我无法对其进行测试,但是我的总体指导方针是为所需范围内的每一分钟创建一个派生表,并将其重新连接到基于分钟,然后计算行数。例如,如果使用的是PostgreSQL并且限制为2018年1月,则可以执行以下操作:
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