SELECT和GROUP BY

时间:2017-11-26 18:53:26

标签: sql postgresql greatest-n-per-group postgresql-8.3

我只想根据MAX(ts)过滤表中的几列。 ts = timestamp。如果我只选择两列 - deviceid和ts:

,一切都会好的
SELECT deviceid, MAX(ts) 
FROM device_data 
GROUP BY deviceid

结果:

enter image description here

但我还需要两列 - 经度和纬度。我有问题,如果我选择经度和纬度,因为它们必须出现在GROUP BY中,并且我使用相同的deviceid获得了太多结果:

enter image description here

如何避免在GROUP BY中插入经度和纬度?

2 个答案:

答案 0 :(得分:1)

有几种解决方案。一种方法是使用窗口函数在按降序日期排序时获取同一deviceid的分区内的第一个经度,纬度等等。

然后您将获得重复项,您可以使用distinct删除

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);

答案 1 :(得分:1)

您可以创建一个包含device_id和每ts最多device_id的表格,然后使用原始device_data进行内部联接,以获得所需的结果。

除非您有多个具有相同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;