繁体   English   中英

SQL查询:选择最新行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM