2011-09-16 5 views
2

답변해야 할 질문은 "60 분 동안 수신 한 최대 페이지 요청 수는 얼마입니까?"입니다.오라클을 사용하여 임의의 날짜 범위에서 행 수 찾기

date_page_requested  date; 
page      varchar(80); 

내가 어떤 60분의 타임 슬라이스 행의 최대 수를 찾고 있어요 :

나는이 비슷한 모양의 테이블이있다.

나는 분석 함수가 나를 거기로 데려다 줄 것이라고 생각했지만 지금까지는 공백을 그리 고있다.

올바른 방향의 포인터가 좋을 것 같습니다.

+0

60 분 동안의 세분성은 무엇입니까? '2011-09-15 08 : 30 : 59.535'에 페이지 요청이 발생한 경우 60 분을 '08', '30', '59'또는 '535'(시간 , 분, 초 또는 밀리 초)? –

답변

2

당신은 작동이 질문에 대해 몇 가지 옵션이 있습니다, 여기에 조인 또는 상관 하위 쿼리 대신 오라클의 "Windowing Functions with Logical Offset"기능을 사용하는 것입니다.

먼저 테스트 테이블 :

Wrote file afiedt.buf 

    1 create table t pctfree 0 nologging as 
    2 select date '2011-09-15' + level/(24 * 4) as date_page_requested 
    3 from dual 
    4* connect by level <= (24 * 4) 
SQL>/

Table created. 

SQL> insert into t values (to_date('2011-09-15 11:11:11', 'YYYY-MM-DD HH24:Mi:SS')); 

1 row created. 

SQL> commit; 

Commit complete. 

T 지금 오전 11시 11분 11초에 하나 개의 추가 행이 하루에 대한 행 매 분기마다 시간이 포함되어 있습니다. 쿼리는 세 단계로 진행됩니다.

1 with x as (select date_page_requested 
    2   , count(*) over (order by date_page_requested 
    3    range between current row 
    4     and interval '1' hour following) as hour_count 
    5  from t) 

그런 다음 HOUR_COUNT에 의해 순서를 지정 : 마지막으로

6 , y as (select date_page_requested 
    7   , hour_count 
    8   , row_number() over (order by hour_count desc, date_page_requested asc) as rn 
    9  from x) 

그리고를 1 단계, 모든 행에 대해, 행의 시간 이후 다음 시간 내에 행의 수를 얻을 수 있습니다 다음 행이 가장 많은 가장 오래된 행을 선택하십시오.

10 select to_char(date_page_requested, 'YYYY-MM-DD HH24:Mi:SS') 
11  , hour_count 
12 from y 
13* where rn = 1 

시간당 60 분짜리 창을 여러 개 연결하면 위의 창은 첫 번째 창만 표시합니다.

+0

고맙습니다. 이 중 몇 가지가 "올바른"결과를 산출했지만,이 결과는 놀랍도록 빠르다. 즉, 훨씬 더 큰 시간대에 실행되도록 조정할 수 있음을 의미한다. – rhacer

0

이것은 필요한 것을 제공해야하며 반환되는 첫 번째 행은 가장 높은 페이지 수를 가진 시간이 이어야합니다.

select number_of_pages 
     ,hour_requested 
from (select to_char(date_page_requested,'dd/mm/yyyy hh') hour_requested 
      ,count(*) number_of_pages 
     from pages 
     group by to_char(date_page_requested,'dd/mm/yyyy hh')) p 
order by number_of_pages 
+0

60 분의 시간 프레임이 모두 시간대 (예 : 15:00)에서 시작하여 시간의 하단 (예 : 15:00)에 끝나면 아름답게 작동합니다., 15:59) 그러나 60 분의 가장 큰 활동 시간이 22:29 ~ 23:28이면 어떨까요? – rhacer

0

어때?

SELECT TOP 1 
     ranges.date_start, 
     COUNT(data.page) AS Tally 
    FROM (SELECT DISTINCT 
       date_page_requested AS date_start, 
       DATEADD(HOUR,1,date_page_requested) AS date_end 
      FROM @Table) ranges 
    JOIN @Table data 
    ON data.date_page_requested >= ranges.date_start 
    AND data.date_page_requested < ranges.date_end 
GROUP BY ranges.date_start 
ORDER BY Tally DESC 
+0

SQL Server (T-SQL)입니다.하지만 아이디어를 얻어야합니다. – groundh0g

+0

니스. Addind 'SELECT TOP 1'과 'Tally DESC ORDER BY Tally DESC'는 최상위 답변 만 제공합니다. –

+0

@ypercube : 완료 – groundh0g

0

PostgreSQL의 경우, 나는 "창"에 대해 이와 같은 것을 쓰고 싶습니다. 이를 위해 OLAP 윈도우 함수가 필요하지 않습니다.

select w.ts, 
     date_trunc('minute', w.ts) as hour_start, 
     date_trunc('minute', w.ts) + interval '1' hour as hour_end, 
     (select count(*) 
     from weblog 
     where ts between date_trunc('minute', w.ts) and 
         (date_trunc('minute', w.ts) + interval '1' hour)) as num_pages 
from weblog w 
group by ts, hour_start, hour_end 
order by num_pages desc 

오라클에는 trunc() 기능이 있지만 형식이 확실하지 않습니다. 나는 잠시 후에 그것을 보거나 친구의 잔인한 쇼를보기 위해 떠날 것이다.

0
WITH ranges AS 
    (SELECT 
      date_page_requested   AS StartDate, 
      date_page_requested + (1/24) AS EndDate, 
      ROWNUMBER() OVER(ORDER BY date_page_requested) AS RowNo 
     FROM 
      @Table 
    ) 

SELECT 
    a.StartDate     AS StartDate, 
    MAX(b.RowNo) - a.RowNo + 1 AS Tally 
FROM 
    ranges a 
    JOIN 
    ranges b 
     ON a.StartDate <= b.StartDate 
     AND b.StartDate < a.EndDate 
GROUP BY a.StartDate 
     , a.RowNo 
ORDER BY Tally DESC 

또는 :

WITH ranges AS 
    (SELECT 
      date_page_requested   AS StartDate, 
      date_page_requested + (1/24) AS EndDate, 
      ROWNUMBER() OVER(ORDER BY date_page_requested) AS RowNo 
     FROM 
      @Table 
    ) 

SELECT 
    a.StartDate      AS StartDate, 
    (SELECT MIN(b.RowNo) - a.RowNo 
     FROM ranges b 
     WHERE b.StartDate > a.EndDate 
    )        AS Tally 
FROM 
    ranges a 
ORDER BY Tally DESC 
관련 문제