programing

포인트별 MySQL MariaDB 그룹 타임스탬프

prostudy 2022. 9. 14. 21:26
반응형

포인트별 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지정 전 데이터 포인트date2점(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

반응형