SELECT 和分组依据
SELECT and GROUP BY
我只想根据 MAX(ts)
从 table 中过滤几列。 ts = timestamp
。如果我 select 只有两列 - deviceid 和 ts:
一切正常
SELECT deviceid, MAX(ts)
FROM device_data
GROUP BY deviceid
结果:
但我还需要两列 - 经度和纬度。如果我 select 经度和纬度,我会遇到问题,因为它们必须出现在 GROUP BY 中,并且我使用相同的设备 ID 得到太多结果:
如何避免在 GROUP BY 中插入经纬度?
对此有多种解决方案。一种是使用 window 函数在按降序日期排序时获取同一 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);
您可以创建一个 table,其中包含 device_id
和每个 device_id
的最大值 ts
,然后与原始 device_data
进行内部连接以获得期望的结果。
除非您有多行具有相同的 device_id
和 max(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;
我只想根据 MAX(ts)
从 table 中过滤几列。 ts = timestamp
。如果我 select 只有两列 - deviceid 和 ts:
SELECT deviceid, MAX(ts)
FROM device_data
GROUP BY deviceid
结果:
但我还需要两列 - 经度和纬度。如果我 select 经度和纬度,我会遇到问题,因为它们必须出现在 GROUP BY 中,并且我使用相同的设备 ID 得到太多结果:
如何避免在 GROUP BY 中插入经纬度?
对此有多种解决方案。一种是使用 window 函数在按降序日期排序时获取同一 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);
您可以创建一个 table,其中包含 device_id
和每个 device_id
的最大值 ts
,然后与原始 device_data
进行内部连接以获得期望的结果。
除非您有多行具有相同的 device_id
和 max(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;