これは、2つのイベントが一つのイベントが完全に別の中に含まれている場合でも、同じ開始日、終了日または持っている場合でも動作します:
Oracleのセットアップ:
CREATE TABLE videos (video_id, video_length, event_id, event_start, event_end) AS
SELECT 1, 10, 1, 1, 4 FROM DUAL UNION ALL
SELECT 1, 10, 2, 1, 3 FROM DUAL UNION ALL -- Same start date
SELECT 1, 10, 3, 2, 4 FROM DUAL UNION ALL -- Same end date
SELECT 1, 10, 4, 3, 6 FROM DUAL UNION ALL
SELECT 1, 10, 5, 7, 9 FROM DUAL UNION ALL
SELECT 1, 10, 6, 8, 8.5 FROM DUAL; -- Contained in previous event
クエリ:
を
SELECT video_id,
SUM(event_duration) AS event_duration,
MAX(video_length) AS video_length
FROM (
SELECT video_id,
video_length,
end_date
- LAST_VALUE(start_date) IGNORE NULLS
OVER (PARTITION BY video_id
ORDER BY ROWNUM) AS event_duration
FROM (
SELECT video_id,
video_length,
CASE WHEN 1 = lvl
AND 1 = SUM(lvl) OVER (PARTITION BY video_id
ORDER BY event_date, lvl DESC, ROWNUM)
THEN event_date
END AS start_date,
CASE WHEN 0 = SUM(lvl) OVER (PARTITION BY video_id
ORDER BY event_date, lvl DESC, ROWNUM)
THEN event_date
END AS end_date
FROM videos
UNPIVOT (event_date FOR lvl IN (event_start AS 1, event_end AS -1))
)
)
GROUP BY video_id;
出力:複雑
VIDEO_ID EVENT_DURATION VIDEO_LENGTH
---------- -------------- ------------
1 7 10
ご使用のデータベースに質問にタグを付けてください。 –