2017-04-10 2 views
0

간격의 테이블이 주어지면 각 간격의 시작 (현재 간격 자체 포함)에서 현재 열린 간격의 수를 효율적으로 쿼리 할 수 ​​있습니까? 나는 그 자체에 대한 데이터 집합을 결합하여이 문제를 해결할 수있는 작은 데이터 세트에BigQuery에서 겹치는 간격의 수

 
start_time count 
     1  1 
     2  2 
     3  3 
     5  3 
     7  2 
     19  1 

: : 나는 다음과 같은 출력을 원하는

 
start_time end_time 
     1  10 
     2  5 
     3  4 
     5  6 
     7  11 
     19  20 

: 다음 표에 주어진 예를 들어

,

WITH intervals AS (
    SELECT 1 AS start, 10 AS end UNION ALL 
    SELECT 2, 5 UNION ALL 
    SELECT 3, 4 UNION ALL 
    SELECT 5, 6 UNION ALL 
    SELECT 7, 11 UNION ALL 
    SELECT 19, 20 
) 
SELECT 
    a.start_time, 
    count(*) 
FROM 
    intervals a CROSS JOIN intervals b 
WHERE 
    a.start_time >= b.start_time AND 
    a.start_time <= b.end_time 
GROUP BY a.start_time 
ORDER BY a.start_time 

대형 데이터 세트의 경우 CROSS JOIN은 비효율적이며 불필요합니다. 주어진 대답은 오직 작은 간격의 이전 간격 (start_time으로 정렬 될 때)에 달려 있습니다. 실제로, 내가 가지고있는 데이터 세트에서, 그것은 시간을 초과합니다. 이것을 달성하기위한 더 좋은 방법이 있습니까? CROSS JOIN을

+0

u는 출력을 설명 할 수에서 더미 데이터로 예를 아래에 사용하여 그것으로 재생할 수 있습니다

을 포함되지 조인? – Teja

+0

출력은 입력으로부터 각 간격의 시작 시간 및 해당 간격의 시작 시간에 열린 간격 (시작 시간 <= 해당 시간 및 끝 시간> = 해당 시간의 행)의 수입니다. –

답변

1

은 ...
이를 달성하기 위해 더 좋은 방법이 있나요 ... 허무하고 불필요한 둘 다?

아래에서 BigQuery Standard SQL을 사용해보십시오. 어떤

#standardSQL 
SELECT 
    start_time, 
    (SELECT COUNT(1) FROM UNNEST(ends) AS e WHERE e >= start_time) AS cnt 
FROM (
    SELECT 
    start_time, 
    ARRAY_AGG(end_time) OVER(ORDER BY start_time) AS ends 
    FROM intervals 
) 
-- ORDER BY start_time 
당신은/테스트 질문

#standardSQL 
WITH intervals AS (
    SELECT 1 AS start_time, 10 AS end_time UNION ALL 
    SELECT 2, 5 UNION ALL 
    SELECT 3, 4 UNION ALL 
    SELECT 5, 6 UNION ALL 
    SELECT 7, 11 UNION ALL 
    SELECT 19, 20 
) 
SELECT 
    start_time, 
    (SELECT COUNT(1) FROM UNNEST(ends) AS e WHERE e >= start_time) AS cnt 
FROM (
    SELECT 
    start_time, 
    ARRAY_AGG(end_time) OVER(ORDER BY start_time) AS ends 
    FROM intervals 
) 
-- ORDER BY start_time 
+0

@BrandonDuRette - 시험해 볼 기회가 있었습니까? –