需要从group-by查询中检索一列,而此列不是group-by子句的一部分。
我有一个从设备接收遥测数据的表:
列:
- transmission_tag varchar --这是一种传输包标识符
- equipment_id int
- measurement int --测量值
- uts int --测量的时间戳'unixtime'
然后我需要从每个设备获取最新的测量结果:
SELECT equipment_id, max(uts)
FROM telemetry
GROUP BY equipment_id
-- works OK and quick, the table has ~100mi registers and has index on (equipment_id, uts)
问题是我需要得到与这个寄存器相关的“transmission_tag”。
我尝试了“WHERE EXISTS”/“WITH auxquery(...)SELECT...",但我无法解决这个问题。
下面的示例检索的正是我需要的(出于测试目的),但它真的很愚蠢。在真实的世界的数据库中,它需要1小时才能运行(它对所有寄存器进行顺序扫描)。
SELECT transmission_tag
FROM telemetry
WHERE CAST(equipment_id as VARCHAR) || '_' || CAST(uts as VARCHAR) IN
(SELECT CAST(equipment_id as VARCHAR) || '_' || CAST(max(uts) as VARCHAR)
FROM telemetry
GROUP BY equipment_id)
表中的行是唯一的,只有一行具有(equipment_id,uts)。
如果答案是特定于数据库的,我使用Postgres。
3条答案
按热度按时间ki0zmccv1#
使用
inner join
连接数据集和表,然后获取transmission_tag:q5iwbnjs2#
我需要从每个设备中获取最新的测量结果[...]问题是我需要获取与此寄存器相关的
transmission_tag
。您希望对表进行“筛选”,而不是聚合它。在Postgres中,我会推荐
distinct on
,它完全符合您的要求:SELECT DISTINCT ON ( expression [, ...] )
只保留每组行的第一行这将为您提供每个设备的整个最新行:
yvgpqqbh3#
你可以使用
distinct on
子句;该查询表示order by
equipment_id, uts desc
,然后获取每个不同equipment_id
的第一行。接下来,您有了自己的行,并且可以从该行获取任何字段值。