복붙노트

[SQL] MySQL의 테이블에서 날짜가 기록의 가장 최근의 세트를 선택하는 방법

SQL

MySQL의 테이블에서 날짜가 기록의 가장 최근의 세트를 선택하는 방법

나는 다음과 같은 필드 MySQL의 테이블에 여러 RPC 호출에 대한 응답을 저장하고있다 :

Table: rpc_responses

timestamp   (date)
method      (varchar)
id          (varchar)
response    (mediumtext)

PRIMARY KEY(timestamp,method,id)

방법 및 ID의 기존의 모든 조합에 대한 가장 최근의 응답을 선택하는 가장 좋은 방법은 무엇입니까?

샘플 데이터 :

timestamp  method  id response
2009-01-10 getThud 16 "....."
2009-01-10 getFoo  12 "....."
2009-01-10 getBar  12 "....."
2009-01-11 getFoo  12 "....."
2009-01-11 getBar  16 "....."

원하는 결과 :

2009-01-10 getThud 16 "....."
2009-01-10 getBar 12 "....."
2009-01-11 getFoo 12 "....."
2009-01-11 getBar 16 "....."

(나는이 같은 문제라고 생각하지 않습니다 - 그것은 나에게 가장 최근의 응답을 제공하지 않습니다)

해결법

  1. ==============================

    1.어떤 조인이 없기 때문에이 캔 쿼리는 잘 수행 할 수 있습니다.

    어떤 조인이 없기 때문에이 캔 쿼리는 잘 수행 할 수 있습니다.

    SELECT * FROM (
        SELECT timestamp, method, id, response
        FROM rpc_responses
        WHERE 1 # some where clause here
        ORDER BY timestamp DESC
    ) as t1
    GROUP BY method
    

    은 "에 의해 그룹은"때문에 내부 쿼리에서 타임 스탬프 DESC BY 순서, 결과 방법에 세트 및 반환 방법 당 1 행, 가장 최근을 축소합니다.

    참고로, PostgreSQL는 언어에 내장이 일을하는 방법이있다 :

    SELECT DISTINCT ON (method) timestamp, method, id, response
    FROM rpc_responses
    WHERE 1 # some where clause here
    ORDER BY method, timestamp DESC
    
  2. ==============================

    2.자기가 대답,하지만 난 테이블이 성장함에 따라이 효율적인 충분한 해결책이 될 것입니다 확실하지 않다 :

    자기가 대답,하지만 난 테이블이 성장함에 따라이 효율적인 충분한 해결책이 될 것입니다 확실하지 않다 :

    SELECT timestamp,method,id,response FROM rpc_responses 
    INNER JOIN
    (SELECT max(timestamp),method,id FROM rpc_responses GROUP BY method,id) latest
    USING (timestamp,method,id);
    
  3. ==============================

    3.이 시도...

    이 시도...

    SELECT o1.id, o1.timestamp, o1.method, o1.response   
    FROM rpc_responses o1
    WHERE o1.timestamp = ( SELECT max(o2.timestamp)
                           FROM rpc_responses o2
                           WHERE o1.id = o2.id )
    ORDER BY o1.timestamp, o1.method, o1.response
    

    ... 그것도 Access에서 작동합니다!

  4. ==============================

    4.난 날 위해, 일을 사용

    난 날 위해, 일을 사용

    select max(timestamp),method,id from tables where 1 group by method,id order by timestamp desc 
    
  5. ==============================

    5.데이터 세트가 커지면 부질 매우 과세된다.

    데이터 세트가 커지면 부질 매우 과세된다.

    이 시도:

    SELECT t1.* 
    FROM rpc_responses AS t1 
    INNER JOIN rpc_responses AS t2 
    GROUP BY t1.method, t1.id, t1.timestamp
    HAVING t1.timestamp=MAX(t2.timestamp)    
    ORDER BY t1.timestamp, t1.method, t1.response;
    
  6. ==============================

    6."가장 최근"의 개념은 매우 모호합니다. 당신은 (100) 가장 최근의 행과 같은 평균 뭔가 당신은 당신의 SELECT 절에 TOP (100)를 추가 할 수 있습니다.

    "가장 최근"의 개념은 매우 모호합니다. 당신은 (100) 가장 최근의 행과 같은 평균 뭔가 당신은 당신의 SELECT 절에 TOP (100)를 추가 할 수 있습니다.

    당신은 그냥 할 수있는 가장 최근의 날짜를 기준으로 "가장 최근"을 의미하는 경우

    SELECT timestamp,method,id,response 
    FROM rpc_responses
    HAVING max(timestamp) = timestamp 
    
  7. ==============================

    7.... 이상 1 년 후입니다하지만 난 사람을 도움이 될 수 있습니다 모든 쿼리가 최근부터 선택

    ... 이상 1 년 후입니다하지만 난 사람을 도움이 될 수 있습니다 모든 쿼리가 최근부터 선택

    SELECT *
    FROM rpc_responses
    ORDER BY timestamp DESC
    
  8. from https://stackoverflow.com/questions/435703/how-to-select-the-most-recent-set-of-dated-records-from-a-mysql-table by cc-by-sa and MIT license