【问题标题】:Sql query: select latest rowsql查询:选择最新行
【发布时间】:2014-04-07 07:46:42
【问题描述】:

我有两张这样的表:

表格信息:

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

【问题讨论】:

  • 您的表格信息似乎只有 3 列
  • 你为什么用mysql postgresql标记这个?您是否同时使用这两种 DBMS?
  • 不,只是论坛问5个标签发帖,两个DBMS都用sql语言:)

标签: sql postgresql join


【解决方案1】:
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 可能会快一点:

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 是一个可怕的列名称。一是因为它也是一个保留字,二是因为它没有记录该列包含的内容:“开始日期”? “结束日期”? “截止日期”? “注册日期”?

【讨论】:

    【解决方案2】:

    简单的内部连接就可以了

    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)
    

    fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多