시간 간격을 기준으로 레코드 그룹화


12

다음 스키마가있는 테이블이 있으며 시간 간격 ( 예 : 분당 레코드 수 )을 기준으로 데이터를 그룹화 할 수있는 쿼리를 정의 한 다음 이전 그룹 이후의 SnapShotValue 변경 사항을 제공해야합니다. 현재 SnapShotValue는 항상 증가하므로 차이의 합계 만 필요합니다. 누구든지 이것을 할 수있는 SQL Server T-SQL 쿼리를 도울 수 있습니까? 스키마를 변경할 수는 있지만 이것이 현재 가지고 있습니다.

개요

CaptureTime   (datetime)
SnapShotValue (int)

샘플 데이터

1 Jan 2012 00:00:00,   100
1 Jan 2012 00:00:30,   125
1 Jan 2012 00:01:00,   200
1 Jan 2012 00:01:30,   300
1 Jan 2012 00:02:15,   400
1 Jan 2012 00:02:30,   425
1 Jan 2012 00:02:59,   500

원하는 쿼리 결과

1 Jan 2012 00:01:00,   225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00,   500 -- Sum of all captured data changes up to the 2 minute mark
1 Jan 2012 00:03:00,   125 -- Sum of all captured data changes up to the 3 minute mark

답변:


17
select dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0),
       sum(SnapShotValue)
from YourTable
group by dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)

SE- 데이터

datediff(minute, 0, CaptureTime)이후의 시간 (분)을 제공합니다 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)이후 시간 (분)을 추가 1900-01-01T00:00:001900-01-01T00:00:00단 몇 분있는 날짜와 끝.

1+당신이 다음 분을 원했기 때문에이있다.

5 분 간격으로 동일한 작업을 수행하려면 몇 가지 계산을 수행해야합니다. 분을 나누고 55하면 분이 5 분 정밀도로 반올림됩니다. SQL Server의 정수 나누기 결과가 정수이기 때문에 작동합니다.

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)

이것은 대답을위한 훌륭한 프레임 워크를 제공했지만 여전히 어떻게 작동하는지 이해하는 데 약간의 어려움이 있습니다. 1 분 간격에서 5 분 간격으로 오프셋을 변경하려고하면 여전히 다른 시작 지점에서 시작하는 전체 결과와 함께 1 분 간격을 얻습니다. 이것이 어떻게 작동하는지 오해하고 있기 때문에 가능성이 큽니다. 1 분 이외의 간격을 보여주는 샘플을 하나 더 제공 할 수 있습니까? 감사합니다 ...
JoeGeeky

0

나는 세 번째 예에서 약간 혼란 스럽습니다. 이것은 1325입니까? 스냅 샷 값의 합계를 캡처하는 데 필요한 요구 사항을 기반으로 아래 쿼리는 원하는 결과를 가져옵니다.

select dateadd(minute,1,convert(varchar(20),capturetime)), sum(snapshotvalue)
from snapshotdata sd
group by dateadd(minute,1,convert(varchar(20),capturetime))

0

다음은 수락 된 답변을 PostgreSQL 로 변환 한 것입니다 (2000 년 1 월 1 일을 기준 날짜로 선택했습니다. 데이터가 그보다 오래된 경우 이전 날짜로 변경).

SELECT 
  TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
  , SUM(SnapShotValue)
FROM table_name
GROUP BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
ORDER BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.