[英]Sql query: select latest row
我有两个这样的表:
表格信息:
4 columns:
-mmsi (pk)
-name
-type
和表position_history
4 columns:
-mmsi (fk)
-latitude
-longitude
-timestamp (//datatype: timestamp without timezone)
position_history示例:
-----mmsi----latitude-----longitude------timestamp------
-----------| -----------|-------------|----------------
1001 | 34.3454 | 123.343 | 2014-04-07 03:37:00
1001 | 24.5443 | 123.343 | 2014-03-07 14:23:00
1001 | 14.1049 | 123.343 | 2014-02-07 18:12:00
1001 | 54.2355 | 123.343 | 2014-01-07 02:00:00
1002 | 34.3454 | 123.343 | 2014-04-07 03:37:00
1002 | 24.3454 | 123.343 | 2014-03-07 03:44:00
1002 | 14.3454 | 123.343 | 2014-02-07 15:37:00
1002 | 54.3454 | 123.343 | 2014-01-07 12:32:00
和信息:
-----mmsi------name---------type--------
-----------| -----------|----------------
1001 | dsg | abc
1002 | cvv | xyz
如何查询这样的返回结果?
mmsi-----name-----type------latitude-----longitude------update_time
1001 dsg abc 34.3454 123.343 2014-04-07 03:37:00
1002 cvv xyz 34.3454 123.343 2014-04-07 03:37:00
简单的内部联接就可以做到
select p.mmsi, i.name, i.type, p.latitude, p.longitude, max(p.update_time)
from position_history p inner join info i
on p.mmsi=i.mmsi
group by p.mmsi
要么
select p.mmsi, i.name, i.type, p.latitude,
p.longitude, p.update_time
from position_history p inner join info i
on p.mmsi=i.mmsi
where p.update_time in (select max(update_time) from table1
group by mmsi)
select *
from info
join (
select mmsi,
latitude,
longitude,
timestamp,
row_number() over (partition by mmsi order by timestamp desc) as rn
from position_history
) ph on ph.mmsi = info.mmsi and ph.rn = 1;
或者distinct on
使用distinct on
可能更快一些:
select *
from info
join (
select distinct on (mmsi)
mmsi,
latitude,
longitude,
timestamp
from position_history
order by mmsi, timestamp desc
) ph on ph.mmsi = info.mmsi;
顺便说一句: timestamp
是列的可怕名称。 首先,因为它也是一个保留字,其次,因为它没有记录该列包含的内容:“开始日期”? 一个“结束日期”? 一个“到期日”? 一个“注册日期”?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.