복붙노트

[SQL] 어떻게 각 키 값에 대한 가장 최근의 타임 스탬프 행을 선택할 수 있습니까?

SQL

어떻게 각 키 값에 대한 가장 최근의 타임 스탬프 행을 선택할 수 있습니까?

I는 센서 데이터의 테이블을 갖는다. 각 행은, 센서 ID, 타임 스탬프, 및 다른 필드를 갖는다. 나는 다른 필드의 일부를 포함하여, 각 센서에 대한 최신 타임 스탬프 단일 행을 선택합니다.

I는 솔루션 센서 ID 및 최대 (타임 스탬프)를 기준으로 다음과 같이 순서로 그룹 될 것이라고 생각 :

SELECT sensorID,timestamp,sensorField1,sensorField2 
FROM sensorTable 
GROUP BY sensorID 
ORDER BY max(timestamp);

이것은 나에게 없다는 오류 준다 "sensorField1는 GROUP BY 절에 표시해야하며 집계에서 사용할 수 있습니다."

이 문제를 접근하는 올바른 방법은 무엇입니까?

해결법

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

    1.완벽을 위해, 여기에 또 다른 가능한 솔루션입니다 :

    완벽을 위해, 여기에 또 다른 가능한 솔루션입니다 :

    SELECT sensorID,timestamp,sensorField1,sensorField2 
    FROM sensorTable s1
    WHERE timestamp = (SELECT MAX(timestamp) FROM sensorTable s2 WHERE s1.sensorID = s2.sensorID)
    ORDER BY sensorID, timestamp;
    

    꽤 자기 설명 나는 생각하지만, 여기 당신이 원하는 경우 더 많은 정보뿐만 아니라 다른 예입니다. 그것은 MySQL의 설명서에서, 그러나 쿼리 이상합니다 (SQL'92 표준을 구현하는) 모든 RDBMS와 함께 작동합니다.

  2. ==============================

    2.이것은 다음과 같이, DISTINCT SELECT 사용하여 상대적으로 우아한 방법으로 수행 끊긴 부하 수 있습니다 :

    이것은 다음과 같이, DISTINCT SELECT 사용하여 상대적으로 우아한 방법으로 수행 끊긴 부하 수 있습니다 :

    SELECT DISTINCT ON (sensorID)
    sensorID, timestamp, sensorField1, sensorField2 
    FROM sensorTable
    ORDER BY sensorID, timestamp DESC;
    

    PostgreSQL의 (여기에 몇 가지 추가 정보)하지만 난에 대한 위의 작품은 다른 엔진을 생각합니다. 경우는, 어떤이가하는 것은 센서 ID와 타임 스탬프에 의해 표 (최신부터 오래된) 종류 명확하지 않다, 그리고 다음 각각의 고유 센서 ID의 첫 번째 행 (즉, 최근의 타임 스탬프를) 반환합니다.

    내 유스 케이스에서 나는 ~ ~ 1K 센서 10M 판독, 그래서 타임 스탬프 기반의 필터를 자체 테이블에 가입하는 것은 매우 리소스를 많이하려고하고있다; 위는 몇 초 걸립니다.

  3. ==============================

    3.당신은 (센서 ID)에 자체 테이블을 조인하고 left.timestamp

    당신은 (센서 ID)에 자체 테이블을 조인하고 left.timestamp

    http://sqlfiddle.com/#!9/45147/37

    SELECT L.* FROM sensorTable L
    LEFT JOIN sensorTable R ON
    L.sensorID = R.sensorID AND
    L.timestamp < R.timestamp
    WHERE isnull (R.sensorID)
    

    하지만 당신은 ID와 많은 값의 작은 금액이있는 경우이 매우 리소스를 많이됩니다, 참고하시기 바랍니다! 그래서, 각각의 센서 값 분마다 수집 측정 - 물건의 일종이 권하고 싶지 않다. 그러나 당신은 단지 "가끔"변경 뭔가의 "개정"을 추적 할 필요가 유스 케이스에, 그것은 쉬운 것입니다.

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

    4.당신은 그룹에있는 또는 집계 함수에 사용되는 열을 선택할 수 있습니다. 당신은이 작업을 얻기 위해 가입 사용할 수 있습니다

    당신은 그룹에있는 또는 집계 함수에 사용되는 열을 선택할 수 있습니다. 당신은이 작업을 얻기 위해 가입 사용할 수 있습니다

    select s1.* 
    from sensorTable s1
    inner join 
    (
      SELECT sensorID, max(timestamp) as mts
      FROM sensorTable 
      GROUP BY sensorID 
    ) s2 on s2.sensorID = s1.sensorID and s1.timestamp = s2.mts
    
  5. ==============================

    5.

    WITH SensorTimes As (
       SELECT sensorID, MAX(timestamp) "LastReading"
       FROM sensorTable
       GROUP BY sensorID
    )
    SELECT s.sensorID,s.timestamp,s.sensorField1,s.sensorField2 
    FROM sensorTable s
    INNER JOIN SensorTimes t on s.sensorID = t.sensorID and s.timestamp = t.LastReading
    
  6. ==============================

    6.내가보고하지 않은 하나의 공통 대답은 윈도우 기능이다, 여기에 아직있다. 당신의 DB가 지원하는 경우는, 상관 하위 쿼리에 대한 대안입니다.

    내가보고하지 않은 하나의 공통 대답은 윈도우 기능이다, 여기에 아직있다. 당신의 DB가 지원하는 경우는, 상관 하위 쿼리에 대한 대안입니다.

    SELECT sensorID,timestamp,sensorField1,sensorField2 
    FROM (
        SELECT sensorID,timestamp,sensorField1,sensorField2
            , ROW_NUMBER() OVER(
                PARTITION BY sensorID
                ORDER BY timestamp
            ) AS rn
        FROM sensorTable s1
    WHERE rn = 1
    ORDER BY sensorID, timestamp;
    

    실제로 상관 관계 서브 쿼리보다이 더 사용합니다. 나도 확실히는 그런 측면에서 스택 방법이 아니에요, 효율성을 통해 의견에서 저를 체포 주시기 바랍니다.

  7. ==============================

    7.나는 대부분 같은 문제가 없었다 및 쿼리에 사소한 문제의 유형을 만드는 다른 솔루션을했다.

    나는 대부분 같은 문제가 없었다 및 쿼리에 사소한 문제의 유형을 만드는 다른 솔루션을했다.

    I는 센서 데이터 테이블을 (1 개 데이터 (30)에 대해 센서로부터의)

    SensorReadings->(timestamp,value,idSensor)
    

    나는 센서에 대한 대부분 정적 물건을 많이하지만, 관련 필드 이들은이있는 센서 테이블이 있습니다 :

    Sensors->(idSensor,Description,tvLastUpdate,tvLastValue,...)
    

    tvLastupdate 및 tvLastValue은 SensorReadings 테이블에 삽입에 트리거에서 설정됩니다. 나는 항상 고가의 쿼리를 수행 할 필요없이이 값에 직접 액세스 할 수 있습니다. 이 비정규 약간 않습니다. 쿼리는 간단하다 :

    SELECT idSensor,Description,tvLastUpdate,tvLastValue 
    FROM Sensors
    

    나는 종종 쿼리 데이터를이 방법을 사용합니다. 내 경우에는 내가 센서 테이블을 가지고 있고, 분 수준에서 오는 데이터와 기계의 수십이 큰 이벤트 테이블은 데이터와 대시 보드와 그래프를 업데이트하고 있습니다. 내 데이터 시나리오로 트리거 앤 캐시 방법은 잘 작동합니다.

  8. from https://stackoverflow.com/questions/17327043/how-can-i-select-rows-with-most-recent-timestamp-for-each-key-value by cc-by-sa and MIT license