2017-01-03 1 views
1

측정 및 상태 데이터가있는 대용량 데이터베이스에서 많은 정보를 잃지 않고 데이터를 줄이려고합니다. 몇 가지 예제를 공부했지만 SQL 기술은 성공하기에는 너무 제한적인 것 같습니다 ...MySQL : 중복 및 상수 값을 제거/집계하여 데이터 정리

테이블에있는 데이터는 수백만 개입니다. 테이블 정의는

TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32) 

일부 예제 데이터입니다.) (최대를 사용하여 읽기 같은 타임 스탬프, 장치와

  • 집계 값 :

    +---------------------+----------+------+---------+---------+-------+------+ 
    | TIMESTAMP   | DEVICE | TYPE | EVENT | READING | VALUE | UNIT | 
    +---------------------+----------+------+---------+---------+-------+------+ 
    | 2016-03-27 10:17:45 | KNX_428c | KNX | 49 mA | state | 49 | mA | 
    | 2016-03-27 10:19:45 | KNX_428c | KNX | 47 mA | state | 47 | mA | 
    | 2016-03-27 10:21:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:23:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:23:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:25:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:25:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:27:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:27:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:29:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:31:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:31:44 | KNX_428c | KNX | 47 mA | state | 47 | mA | 
    | 2016-03-27 10:33:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:33:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:34:04 | KNX_428c | KNX | 136 mA | state | 136 | mA | 
    | 2016-03-27 10:34:04 | KNX_428c | KNX | 165 mA | state | 165 | mA | 
    | 2016-03-27 10:34:05 | KNX_428c | KNX | 136 mA | state | 136 | mA | 
    | 2016-03-27 10:34:05 | KNX_428c | KNX | 107 mA | state | 107 | mA | 
    | 2016-03-27 10:34:05 | KNX_428c | KNX | 79 mA | state | 79 | mA | 
    | 2016-03-27 10:34:06 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:34:29 | KNX_428c | KNX | 107 mA | state | 107 | mA | 
    | 2016-03-27 10:34:29 | KNX_428c | KNX | 136 mA | state | 136 | mA | 
    | 2016-03-27 10:34:30 | KNX_428c | KNX | 165 mA | state | 165 | mA | 
    | 2016-03-27 10:34:30 | KNX_428c | KNX | 139 mA | state | 139 | mA | 
    | 2016-03-27 10:34:30 | KNX_428c | KNX | 107 mA | state | 107 | mA | 
    | 2016-03-27 10:34:31 | KNX_428c | KNX | 51 mA | state | 51 | mA | 
    | 2016-03-27 10:34:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:35:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:37:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:37:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:39:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:41:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:43:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:45:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:47:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:47:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:49:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    

    내가 두 가지 일을 할 의도 : 전체 표는 각 개별적으로 처리되어야 다양한 장치 및 판독을 가지고

  • 상수 값의 처음과 마지막을 제외하고 연속적인 동일한 값을 제거하십시오.

그룹과 함께 선택한 성명서에서 내가 달성 한 첫 번째 일. 하지만 실제로 데이터베이스를 변경하는 방법을 모르겠습니다. 내가 몇 가지 예를 볼 수있는 두 번째 단계에 대한

SELECT *,MAX(VALUE) FROM filelog 
GROUP BY TIMESTAMP,DEVICE,READING 

하지만, 항상 하나 개의 레코드의 중복을 결합하지 두 (첫 번째와 마지막) 나는 그것을 할 의도로. 그리고 대개이 예제는 JOIN에서 작동합니다. JOIN은 수백만 개의 데이터 세트로는 불가능하다고 생각합니다.

결과는 다음과 같이한다 : 당신의 지원에

| 2016-03-27 10:17:45 | KNX_428c | KNX | 49 mA | state | 49 | mA | 
| 2016-03-27 10:19:45 | KNX_428c | KNX | 47 mA | state | 47 | mA | 
| 2016-03-27 10:21:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
| 2016-03-27 10:33:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
| 2016-03-27 10:34:04 | KNX_428c | KNX | 136 mA | state | 165 | mA | 
| 2016-03-27 10:34:05 | KNX_428c | KNX | 136 mA | state | 136 | mA | 
| 2016-03-27 10:34:06 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
| 2016-03-27 10:34:29 | KNX_428c | KNX | 107 mA | state | 136 | mA | 
| 2016-03-27 10:34:30 | KNX_428c | KNX | 165 mA | state | 165 | mA | 
| 2016-03-27 10:34:31 | KNX_428c | KNX | 51 mA | state | 51 | mA | 
| 2016-03-27 10:34:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
| 2016-03-27 10:49:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 

감사합니다.

+0

두 번째 요구 사항은 분명하지 않습니다. 샘플 데이터를 사용하여 의미를 보여줄 수 있습니까? –

+0

레코드 수는 조인 작업과 관련이 없습니다. 하지만 어쨌든 당신이 필요하다고 생각하지 않습니다. 보관할 레코드를 다른 테이블로 복사하고 원본 데이터를 제거하는 것이 더 쉽습니다. – Shadow

+0

두 번째 단계는 예상 된 결과와 함께 명확 해 졌습니까? – Xcoder

답변

0

첫 번째 쿼리의 경우 집계 후에 전체 레코드를 얻으려면 제안한 것보다 더 많은 작업을 수행해야합니다. 한 가지 방법은 추가 참여를하는 것입니다.

SELECT t1.* 
FROM filelog t1 
INNER JOIN 
(
    SELECT TIMESTAMP, DEVICE, READING, MAX(VALUE) AS VALUE 
    FROM filelog 
    GROUP BY TIMESTAMP, DEVICE, READING 
) t2 
    ON t1.TIMESTAMP = t2.TIMESTAMP AND 
     t1.DEVICE = t2.DEVICE AND 
     t1.READING = t2.READING AND 
     t1.VALUE  = t2.VALUE 
+0

좋은 점은 무엇입니까? 2016-03-27 10:34:05 데이터의 올바른 최대 값을 갖기 위해 MAX (CAST (DECIMAL VALUE) 값)를 수행해야합니다. 그러나이 방법은 파일 로그 자체의 데이터를 변경하지는 않습니다? – Xcoder

+0

추가 연구를 통해 나는이 대답이 잘못되었음을 알고 있으며, 중복없이 레코드를보고합니다. 데이터베이스에서 중복 된 보고서를 영구적으로 제거하고 최대 값으로 새로운 레코드로 대체하는 성명서가 있습니다. – Xcoder