sql - 选择和分组

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

我只想根据 MAX(ts) 从表中过滤几列。 ts = 时间戳。如果我只选择两列 - 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 中插入经度和纬度?

最佳答案

对此有多种解决方案。一种是使用窗口函数在按日期降序排列时获取同一 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);

关于sql - 选择和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47499792/

相关文章:

mysql - 如果列没有特定文本,如何更改列的值?

php - 在 PHP 中,当将 PDO 与 pgSQL 一起使用时,如何在原始 INSERT sql 查询中获取 "RETURNING"子句的值

mysql - 分组时通过显示最早的连接结果进行排序

sql - mysql 截断表与删除

PHP PDO : Why cause this error in sql statement?

sql - 数据库表同义词/别名

bash - 在 bash 命令行使用 psql 测试 postgresql 连接字符串?

MySQL:按子字符串搜索

mysql - 显示符合条件的最新ID

sql - ST_SnapToGrid 单位