2014-12-01 2 views
1

당 하나 개의 행을 유지 ..MySQL을 - 내가 밀리 초까지 시간 소인이 표시됩니다 행이 MySQL은 매우 큰 테이블이 분

을 내가 날짜를 (라고 날짜)

2011-01-13 
를 포함하는 날짜 열이

및 시간, 분, 초, 밀리 초 단위로 시간을 포함하는 다른 열 .. 내가 분당 너무 많은 기록을 갖고 있기 때문에, 나는 분당 하나 개의 항목을 유지하는 것이이 가능하다

01:11:43.381 

(라고 시간) 삭제 같은 분에 다른 항목이 있습니까? (예를 들어 매분마다 첫 번째 항목을 유지할 수 있습니다)

어떻게 할 수 있습니까? 내가 조금 :(많이!

+1

매분마다 행을 삽입하는 것이 더 바람직하지 않습니까? – wvdz

+0

어쩌면 데이터베이스에 거대한 CSV 파일 (5GB의 5 개 CSV 등)을 가져 와서 나는 이미 많은 처리를 했었지만 내가하는 말은 어떻게하면 좋을까요? – adrCoder

+0

이 테이블에 다른 기본 키가 있습니까? – kamoor

답변

1

당신은 당신이 delete와 통합으로 원하는 것을 할 수 있습니다 :이 효율적인 있음을 약속하고 있지 않다

delete bt 
    from bigtable bt join 
     (select date, min(time) as time 
      from bigtable 
      group by date, hour(time), minute(time) 
     ) btt 
     on btt.date = bt.date and 
      hour(bt.time) = hour(btt.time) and 
      minute(bt.time) = minute(btt.time) and 
      bt.time <> btt.mintime; 

,하지만 당신이 원하는 것을해야 .

+0

고마워요.하지만 "t"는 뭐니? 테이블이나 sth의 이름으로 바꿔야합니까? – adrCoder

+0

@adrCoder. . . 오타. 그것은'bt '이어야합니다. –

+0

민트 타임이란 무엇입니까? 오류가 발생했습니다. 오류 1054 (42S22) : '절에'알 수없는 열 'bt.mintime' – adrCoder

0

날짜와 시간이 매우 성가신 증명할 수있는 두 개의 컬럼으로 분할 데

감사를 검색하지만 나는 온라인 아무것도 찾을 수 없습니다, 그래서 나는 그 일을 피할 거라고하지 않는 한 강력한 기술적 인 이유가 있었다. 당신의 분 문제에 관해서는

, 당신이 필요하면. 가장 간단한 방법에 UNIQUE 제약 조건을 적용 할 수있는 열을 나눈 초에 분 시리얼, 또는 시대의 시간을 사용하는 것입니다 60.

열 c 추가 all epoch_minuteINT 인 경우이를 UNIQUE 인덱스 제약 조건을 부여하고 해당 값과 동일한 값으로 채 웁니다. 그런 다음 INSERT IGNORE 또는 INSERT ... ON DUPLICATE KEY 유형 트리거를 사용하여 분당 반복을 처리 할 수 ​​있습니다. 이것은 첫 번째 레코드를 유지할 것인지, 매분마다 마지막 레코드를 유지할 것인지에 달려 있습니다.

당신은 UNIX_TIMESTAMP() 기능을 사용하여 이전 값을 마이그레이션 할 수 있습니다, table_name라는 테이블에 주어진 예를 들어

UPDATE table_name SET epoch_minute = UNIX_TIMESTAMP(date_column)/60 

을 고유 열 제약이있는 값을받을 새 테이블을 준비 :

INSERT IGNORE INTO _table_name (column_a, column_b, epoch_minute) 
    SELECT column_a, column_b, UNIX_TIMESTAMP(date_column)/60 
    FROM table_name; 
,536 :
CREATE TABLE _table_name LIKE table_name; 
ALTER TABLE _table_name ADD COLUMN epoch_minute INT; 
CREATE UNIQUE INDEX index_table_name_epoch_minute ON _table_name (epoch_minute); 

그럼 당신은 중복을 건너 뛸 INSERT IGNORE을 사용할 수 있습니다

마지막으로, 스왑 테이블 :

RENAME TABLE table_name TO table_name_old, _table_name to table_name; 
+0

답장을 보내 주셔서 감사합니다. 이 epoch_minute를 만드는 방법을 알려줄 수 있습니까? 특히 "그 값과 같은 값으로 채우는"방법은 무엇입니까? 나는 내가 넣어야하는 것을 얻지 못한다. 나는 매분마다 첫 번째 기록을 얻을 수 있었고, 지금은 나에게별로 중요하지 않다. 필자가 당시와 날짜를 분리 한 이유는 CSV 파일에서 내 데이터가 다음과 같이 어디에 있는지 알 수 없었기 때문입니다. 04-OCT-2012,07 : 11 : 12.736. 분리 할 때 – adrCoder

+0

가져올 때 가능하면 두 값을 하나로 결합하십시오. 영어로 작성된 날짜는 문제가 될 수 있으므로 [ISO-8601] (http://en.wikipedia.org/wiki/ISO_8601) 'YYYY-MM-DD HH : MM : SS'형식으로 다시 작성하는 것이 바람직합니다. 모호성을 피할 수 있습니다. 새로운 컬럼을 도입하기 위해서는'ALTER TABLE' 만하면됩니다. 나는 더 많은 지침으로 나의 대답을 수정했다. – tadman

+0

고유 인덱스를 만들려고하면 오류가 발생합니다. mysql> CREATE UNIQUE INDEX index_table_name_epoch_minute (epoch_minute); ERROR 1064 (42000) : SQL 구문에 오류가 있습니다. 올바른 구문이 1 행에서 '(epoch_minute)'근처에서 사용하도록 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. CREATE UNIQUE INDEX가되어야합니다. index_table_name_epoch_minute ON _EuroDollar (epoch_minute); 대신에? – adrCoder

0

아래의 간단한 삭제 명령문을 사용하여 명시한 조건을 충족하는 첫 번째 행을 제외한 모든 행을 삭제할 수 있어야합니다.

DELETE FROM TABLE1 WHERE ID NOT IN (
     SELECT I FROM (
       SELECT MIN(PRIMARY_KEY) I, 
         CONCAT(DATE_FIELD ,' ', SUBSTR(TIME_FIELD, 1, 5)) DT 
       FROM TABLE1 GROUP BY DT) AS X) 

는 기본적으로 나는 날짜 및 "분까지 시간을"연결할 및 내부 질의의 최소 식별자를 필터링, 그리고 선택된 최소 ID를 제외한 모든 것을 삭제하려고합니다.

중요 사항 : 불필요한 레코드를 여러 번 삽입하지 않는 것이이 문제를 해결하는 가장 좋은 방법이지만 이미 질문 한 사람은 옵션이 아닙니다.