복붙노트

[SQL] 데이터 간격으로 그룹

SQL

데이터 간격으로 그룹

나는 상점이 일정 기간 동안 네트워크 대역폭 사용과 단일 테이블이있다. 한 열은 날짜 시간 (기본 키)를 포함하고 다른 열은 대역폭을 기록합니다. 데이터는 매 분마다 기록됩니다. 우리는 시간에 그 순간에 다른 데이터를 기록하는 다른 열이있을 것이다.

사용자가 (24 시간 동안 시작과 끝 날짜 주어진 이내)로 15 분 간격의 데이터를 요청하는 경우, 내가 필요한 데이터를 얻을 수있는 단일 쿼리와 그 수 있습니다 또는 나는이 작업을 수행하는 저장 프로 시저 / 커서를 작성해야 ? 사용자을 5 개 간격으로 데이터 등을 요청할 수있다

내가 가장 가능성이 포스트 그레스를 사용하지만 더 좋을 거라 다른 NOSQL 옵션이있다?

어떤 아이디어?

해결법

  1. ==============================

    1.

    WITH t AS (
       SELECT ts, (random()*100)::int AS bandwidth
       FROM   generate_series('2012-09-01', '2012-09-04', '1 minute'::interval) ts
       )
    
    SELECT date_trunc('hour', ts) AS hour_stump
          ,(extract(minute FROM ts)::int / 15) AS min15_slot
          ,count(*) AS rows_in_timeslice               -- optional
          ,sum(bandwidth) AS sum_bandwidth
    FROM   t
    WHERE  ts >= '2012-09-02 00:00:00+02'::timestamptz -- user's time range
    AND    ts <  '2012-09-03 00:00:00+02'::timestamptz -- careful with borders 
    GROUP  BY 1, 2
    ORDER  BY 1, 2;
    

    분당 하나의 타임 스탬프 TS를 대역폭 번호 : 열팽창 계수의 t는 테이블과 같은 데이터를 보유 할 수 있습니다. (당신은 대신 테이블 작업, 그 부분이 필요하지 않습니다.)

    여기에 매우 비슷한 질문에 대한 매우 유사한 솔루션입니다 -이 특정 집단의 작동 방법에 대한 자세한 설명과는 :

    다음은 합계를 실행에 관한 비슷한 질문에 대한 유사한 솔루션입니다 - 자세한 설명과 사용되는 다양한 기능에 대한 링크는 :

    WITH -- same as above ...
    
    SELECT DISTINCT ON (1,2)
           date_trunc('hour', ts) AS hour_stump
          ,(extract(minute FROM ts)::int / 15) AS min15_slot
          ,bandwidth AS bandwith_sample_at_min15
    FROM   t
    WHERE  ts >= '2012-09-02 00:00:00+02'::timestamptz
    AND    ts <  '2012-09-03 00:00:00+02'::timestamptz
    ORDER  BY 1, 2, ts DESC;
    

    취득로 15 분 간격 당 하나의 해제 집계 샘플 - 창에서 사용 가능한 마지막 행에서. 행이 누락되지 않은 경우는 15 분 될 것입니다. 중요한 부분은 DISTINCT ON 및 ORDER BY입니다. 여기에 사용 된 기술에 대한 자세한 정보 :

  2. ==============================

    2.

    select
        date_trunc('hour', d) + 
        (((extract(minute from d)::integer / 5 * 5)::text) || ' minute')::interval
        as "from",
        date_trunc('hour', d) + 
        ((((extract(minute from d)::integer / 5 + 1) * 5)::text) || ' minute')::interval
        - '1 second'::interval
        as "to",
        sum(random() * 1000) as bandwidth
    from 
        generate_series('2012-01-01', '2012-01-31', '1 minute'::interval) s(d)
    group by 1, 2
    order by 1, 2
    ;
    

    5 개 범위에 대해 그. 15 분 동안 15으로 나눕니다.

  3. from https://stackoverflow.com/questions/12623358/group-by-data-intervals by cc-by-sa and MIT license