我有下面的表格。在哪里有很多不同类型的行。我只想在每种类型中选择最新记录。当然会有sensor_external_id
和sensor_id
值不同的记录。
我需要同时按sensor_id
和type
分组。对于该组(sensor_id
,type
),我需要选择具有最新date
的行。
id average date sensor_external_id sensor_id type value
950 2019-10-25 20:34:23 2C3AE834ED58 124 3 25
951 25 2019-10-25 20:34:23 2C3AE834ED58 124 0 25
952 56 2019-10-25 20:34:23 2C3AE834ED58 124 2 56
953 43 2019-10-25 20:34:23 2C3AE834ED58 124 1 41
1411 2019-10-25 20:54:23 2C3AE834ED58 124 3 25
1412 24 2019-10-25 20:54:23 2C3AE834ED58 124 0 23
1413 53 2019-10-25 20:54:23 2C3AE834ED58 124 2 47
1414 41 2019-10-25 20:54:24 2C3AE834ED58 124 1 36
在这种情况下,我需要确切的结果:
id average date sensor_external_id sensor_id type value
1411 2019-10-25 20:54:23 2C3AE834ED58 124 3 25
1412 24 2019-10-25 20:54:23 2C3AE834ED58 124 0 23
1413 53 2019-10-25 20:54:23 2C3AE834ED58 124 2 47
1414 41 2019-10-25 20:54:24 2C3AE834ED58 124 1 36
我试图按type
和date
分组,但没有成功。
有什么想法吗?
使用row_number()
Select * from( Select *,
row_number() over
(partition by type order by date desc)
from table) rn) t where t.rn=1
这是典型的每组最多-n个问题。在大多数RDBMS上通常具有良好性能的通用解决方案是使用相关子查询:
select t.*
from mytable t
where t.date = (
select max(t1.date) from mytable t1 where t1.type = t.type
)
为了提高性能,您需要在(type, date)
上建立索引。
如果您想要每个type
和 sensor_id
的最新记录,则:
select t.*
from mytable t
where t.date = (
select max(t1.date)
from mytable t1
where t1.type = t.type and t1.sensor_id = t.sensor_id
)