[SQL] 5,15,30 60 분 간격으로 그룹 날짜 시간
SQL5,15,30 60 분 간격으로 그룹 날짜 시간
나는, 15, 5로 그룹에 30 ~ 60 분 간격으로 일부 레코드를 시도하고있다 :
SELECT AVG(value) as "AvgValue",
sample_date/(5*60) as "TimeFive"
FROM DATA
WHERE id = 123 AND sample_date >= 3/21/2012
나는 각겠습니까 그룹 내 평균 값을 원하는 시간 단위로 여러 쿼리를 실행합니다. 5 분 쿼리는 다음과 같은 결과를 반환 할 것입니다 그래서 :
AvgValue TimeFive
6.90 1995-01-01 00:05:00
7.15 1995-01-01 00:10:00
8.25 1995-01-01 00:15:00
30 분의 쿼리는이 발생할 것입니다 :
AvgValue TimeThirty
6.95 1995-01-01 00:30:00
7.40 1995-01-01 01:00:00
mm : 날짜 시간 열은 YYYY-MM-DD HH에 SS 형식
나는 나의 날짜 컬럼의 암시 적 변환 오류를 얻고있다. 어떤 도움을 많이 감사합니다!
해결법
-
==============================
1.사용
사용
datediff(minute, '1990-01-01T00:00:00', yourDatetime)
1990년 1월 1일가 (당신이 원하는 기준일을 사용할 수 있습니다) 때문에 당신에게 (분)을 제공 할 것입니다.
이어서이 분할의 결과로 5, 15, 30, 60, 및 그룹으로 나눌 수있다. 당신은 당신이에 의해 그룹에 사용할 수있는 정수를 얻을 수 있습니다, 그래서 나는 그것이 정수 부문으로 평가됩니다 cheked했습니다.
즉
group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5
원래의 질문으로 업데이트를 그룹화 한 후 날짜 - 시간 형식으로 표시되는 데이터를 필요로 편집 한, 나는 영업 이익은 원하는 것을 할 것입니다 간단한 쿼리를 추가했습니다 :
-- This convert the period to date-time format SELECT -- note the 5, the "minute", and the starting point to convert the -- period back to original time DATEADD(minute, AP.FiveMinutesPeriod * 5, '2010-01-01T00:00:00') AS Period, AP.AvgValue FROM -- this groups by the period and gets the average (SELECT P.FiveMinutesPeriod, AVG(P.Value) AS AvgValue FROM -- This calculates the period (five minutes in this instance) (SELECT -- note the division by 5 and the "minute" to build the 5 minute periods -- the '2010-01-01T00:00:00' is the starting point for the periods datediff(minute, '2010-01-01T00:00:00', T.Time)/5 AS FiveMinutesPeriod, T.Value FROM Test T) AS P GROUP BY P.FiveMinutesPeriod) AP
참고 : 나는 명확성을 위해 3 개 하위 쿼리에서이 분할했습니다. 당신은 안에서부터 밖으로을 읽어야합니다. 그것은 물론, 하나의 소형 쿼리로 기록 될 수있다
참고 :이 기간을 변경하고 시작 날짜와 시간은 주어진 일부터 주처럼, 당신이 필요로하는 어떤 간격을 얻을 수 있습니다, 또는 당신이 무엇을 필요로 할 수있는 경우
이 쿼리는이를 사용하기위한 테스트 데이터를 생성하려면 :
CREATE TABLE Test ( Id INT IDENTITY PRIMARY KEY, Time DATETIME, Value FLOAT) INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:00:22', 10) INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:03:22', 10) INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:04:45', 10) INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:07:21', 20) INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:10:25', 30) INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:11:22', 30) INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:14:47', 30)
쿼리를 실행의 결과는 이것이다 :
Period AvgValue 2012-03-22 00:00:00.000 10 2012-03-22 00:05:00.000 20 2012-03-22 00:10:00.000 30
-
==============================
2.JotaBe의 대답 @에 구축하는 것은 (이에 나는에 언급 할 수 - 그렇지 않으면 나는 것), 당신은 또한 하위 쿼리 필요하지 않습니다 이런 식으로 뭔가를 시도 할 수 있습니다.
JotaBe의 대답 @에 구축하는 것은 (이에 나는에 언급 할 수 - 그렇지 않으면 나는 것), 당신은 또한 하위 쿼리 필요하지 않습니다 이런 식으로 뭔가를 시도 할 수 있습니다.
SELECT AVG(value) AS 'AvgValue', -- Add the rounded seconds back onto epoch to get rounded time DATEADD( MINUTE, (DATEDIFF(MINUTE, '1990-01-01T00:00:00', your_date) / 30) * 30, '1990-01-01T00:00:00' ) AS 'TimeThirty' FROM YourTable -- WHERE your_date > some max lookback period GROUP BY (DATEDIFF(MINUTE, '1990-01-01T00:00:00', your_date) / 30)
이 변경 사항은 임시 테이블 및 하위 쿼리를 제거합니다. 내가 그냥 둥근 날짜와 시간을 얻을 수있는 간격 계산을 반대하고있어 결과의 일부로서 데이터 등을 제시하면 30 분 간격으로 그룹화하지만 동일한 코어 로직을 사용합니다.
-
==============================
3.그래서, 경우에 당신은이 인터넷 검색,하지만 당신은 내 사건이었다 MySQL은, 그것을 수행해야합니다
그래서, 경우에 당신은이 인터넷 검색,하지만 당신은 내 사건이었다 MySQL은, 그것을 수행해야합니다
MySQL의에서 당신은 할 수있다
GROUP BY CONCAT( DATE_FORMAT(`timestamp`,'%m-%d-%Y %H:'), FLOOR(DATE_FORMAT(`timestamp`,'%i')/5)*5 )
from https://stackoverflow.com/questions/9814930/group-datetime-into-5-15-30-and-60-minute-intervals by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 조건부 흐름 (0) | 2020.05.25 |
---|---|
[SQL] BIGINT 소요 pseudo_encrypt () 함수 plpgsql (0) | 2020.05.25 |
[SQL] C #으로 SQLite.NET와 마지막 삽입 ID 얻기 (0) | 2020.05.25 |
[SQL] 나는 앱 엔진 애플리케이션과 MySQL 데이터베이스를 사용할 수 (0) | 2020.05.25 |
[SQL] "- 제로 행이 페치 선택 또는 처리 된 데이터 없음 오류 1329"어떻게이 제거되지하세요 (0) | 2020.05.25 |