2017-11-26 3 views
1

MAX(ts)에 따라 테이블에서 몇 개의 열만 필터링하고 싶습니다. ts = timestamp.SELECT 및 GROUP BY

SELECT deviceid, MAX(ts) 
FROM device_data 
GROUP BY deviceid 

및 결과 :

enter image description here

그러나 나는 또한 두 개의 열이 더 필요 - 경도 및 lattitude을의 DeviceID 및 TS - 나는 단지 두 개의 열을 선택하면 모든 것이 OK입니다. 그들이 GROUP BY에 표시하기 때문에 내가 경도 및 lattitude을 선택하면 그 문제를 가지고 나는 같은 DeviceID가 너무 많은 결과를 얻을 :

enter image description here

어떻게 GROUP BY에 경도 및 lattitude를 삽입 피할 수 있습니까?

+0

사용중인 DBMS는 무엇입니까? – Hadi

+0

어떤 데이터베이스입니까? 내 생각에 u 중첩 된 쿼리가 필요하지만 구문은 사용되는 데이터베이스에 따라 달라질 수 있습니다. –

+0

DBMS에 대한 정보가 없으니 죄송합니다. PostgreSQL을 사용하고 있습니다. –

답변

1

여기에는 몇 가지 해결책이 있습니다. 하나는 창 함수를 사용하여 내림차순으로 정렬 할 때 동일한 deviceid의 파티션에서 첫 번째 경도, 위도 등을 가져 오는 것입니다. 다음은 내부 device_data 원본이 원하는 얻을에 가입 할,

SELECT DISTINCT deviceid, 
     FIRST_VALUE(longitude) OVER win AS longitude, 
     FIRST_VALUE(latitude) OVER win AS latitute, 
     FIRST_VALUE(ts) OVER win AS ts 
FROM device_data 
WINDOW win AS (PARTITION BY deviceid ORDER BY ts DESC); 
+0

안녕하세요, 나는 SELECT DISTINCT를 실행하려고합니다. 처음에는 오류가 발생합니다. OVER : 또는 근처의 구문 오류 –

+1

어떤 버전의 postgresql을 실행하고 있습니까? – trincot

+1

@DamianKowalewski : 해당 쿼리에 오류가 발생하면 Postgres를 사용하지 않거나 Postgres –

1

당신은 device_idtsdevice_id 및 최대를 포함하는 테이블을 만들 수 있습니다

그럼 당신은 당신이 distinct으로 제거 할 수 있습니다 중복을 얻을 것이다 결과.

device_idmax(ts)이 같은 행이 여러 개있는 경우가 아니라면이 방법을 사용할 수 있습니다.

SELECT a.deviceid, a.ts, a.longitude, a.lattitude 
FROM device_data a 
INNER JOIN 
(SELECT deviceid, MAX(ts) as max_ts 
FROM device_data 
GROUP BY deviceid) b ON a.ts = b.max_ts 
GROUP BY 1,2,3,4; 
+0

작품 :) 아주 아주 고마워요 :) –

+0

매우 매우 환영합니다 :) – penguin

+0

나는 다른 주제를 만들 수 있도록 또 다른 하나의 질문을 만들 것입니다 :) –