반응형
포인트별 MySQL MariaDB 그룹 타임스탬프
다음과 같은 것이 있습니다.
- 매일 수집된 데이터 지점(관련된 데이터 지점)
date
- UNIX 타임스탬프
저는 다음 사항을 달성하려고 합니다.
- 하루에 데이터 포인트를 필터링합니다. 즉, 하루에 데이터 포인트가 4개 있다고 가정하면 데이터 포인트를 다음 값으로 줄이려고 합니다.
n
일별 데이터 지점 사용GROUP BY
.
다음 쿼리를 사용하고 있습니다.
SELECT *,FLOOR(UNIX_TIMESTAMP(date)/((1440/n)*60))
AS timekey
FROM `tbl`
where date < 'date'
GROUP BY timekey)m
UNION
(SELECT * ,0 As timekey FROM `tbl`
where date > 'date' );
이에 따라 날짜 < given _ date _ in _ query >의 모든 행의 데이터 포인트에 대한 타임키가 생성됩니다.
n
그룹화할 포인트 수를 결정합니다.
그 다음에GROUP BY
최종적으로는 에 관한 데이터 포인트의 수를 삭감할 필요가 있습니다.n
.
위의 쿼리는 다음 값을 초과하는 테이블에 대해 작동합니다.
20000 rows
.위해서
n=2
지정 전 데이터 포인트date
2점(4에서 2행)으로 감소합니다.
작성 스크립트는 다음과 같습니다.
CREATE TABLE `tbl_a` (
`id` int(25) NOT NULL AUTO_INCREMENT,
`pid` bigint(11) NOT NULL,
---
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
---
PRIMARY KEY (`id`),
UNIQUE KEY `phase_id_2` (`phase_id`,`date`),
KEY `id` (`id`,`pid`),
KEY `date` (`date`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
쿼리는 위의 표에 대해 완벽하게 작동합니다.
그러나 행 수가 비교적 적은 다른 DB에서 동일한 쿼리를 시도하면 예상대로 작동하지 않습니다.
그러면 쿼리에서 지정된 날짜만 줄어들고 나머지는 변경되지 않은 상태로 유지됩니다.
.즉, 쿼리에서 given_date에 대응하는 행만 쿼리에 의해 축소되고 나머지 행은 변경되지 않은 상태로 유지됩니다.
테스트 테이블 생성 스크립트:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `date` (`date`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
인덱스 오류 또는 데이터베이스 엔진 예외일 수 있습니다.
문제를 재현하는 순서:
test tbl을 만듭니다.
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `date` (`date`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
데이터 삽입:
INSERT INTO test (date) VALUES ('2015-11-01 00:00:00');
INSERT INTO test (date) VALUES ('2015-11-01 06:00:00');
INSERT INTO test (date) VALUES ('2015-11-01 12:00:00');
INSERT INTO test (date) VALUES ('2015-11-01 18:00:00');
INSERT INTO test (date) VALUES ('2016-11-01 00:00:00');
INSERT INTO test (date) VALUES ('2016-11-01 06:00:00');
INSERT INTO test (date) VALUES ('2016-11-01 12:00:00');
INSERT INTO test (date) VALUES ('2016-11-01 18:00:00');
INSERT INTO test (date) VALUES ('2016-11-02 00:00:00');
INSERT INTO test (date) VALUES ('2016-11-02 06:00:00');
INSERT INTO test (date) VALUES ('2016-11-02 12:00:00');
INSERT INTO test (date) VALUES ('2016-11-02 18:00:00');
INSERT INTO test (date) VALUES ('2017-11-02 00:00:00');
INSERT INTO test (date) VALUES ('2017-11-02 06:00:00');
INSERT INTO test (date) VALUES ('2017-11-02 12:00:00');
INSERT INTO test (date) VALUES ('2017-11-02 18:00:00');
쿼리 실행:
SELECT * FROM
(SELECT *,FLOOR(UNIX_TIMESTAMP(date)/((1440/2)*60))
AS timekey
FROM `test`
where date < '2017-11-02'
GROUP BY timekey) m
UNION
(SELECT * ,0 As timekey FROM `test`
where date > '2017-11-02');
위의 사항은 다음과 같습니다.
- 이전의 모든 데이터 포인트를 삭감하다
2017-11-02
결과는 10이 됩니다.
언급URL : https://stackoverflow.com/questions/56442711/mysql-mariadb-group-timestamp-by-points
반응형
'programing' 카테고리의 다른 글
C 코드 블록은 왜 곱슬 괄호로 묶습니까? (0) | 2022.09.14 |
---|---|
JavaScript 폐쇄는 어떻게 작동합니까? (0) | 2022.09.14 |
MySQL은 단일 행에서와 같이 최소 열과 최대 열에 대해 일치하는 행을 가져옵니다. (0) | 2022.09.14 |
보기에 대한 외부 키 만들기 (0) | 2022.09.14 |
MariaDB 루트 사용자에 대해 암호 및 unix_socket 인증을 사용하도록 설정하시겠습니까? (0) | 2022.09.14 |