postgresql 同一组的最后一条记录

flvtvl50  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(228)

我认为有类似的问题,但没有一个真正符合我的情况。我尝试左外连接,以获得最新的状态,但我不能得到最新的记录基于父ID分组。
我有以下表格
文件表
| 身份证|版本名|参数标识1|父标识2|时间戳|
| - ------|- ------|- ------|- ------|- ------|
| 用户界面1|A类|1个|一百|时间戳1|
| 用户界面2|B|1个|一百|时间戳2|
| UUI3|C级|第二章|一百|时间戳3|
| UUI4|D级|第二章|一百|时间戳4|
| UUI5|E级|第二章|一百|时间戳5|
文档历史表
| 文档标识|地位|时间戳|
| - ------|- ------|- ------|
| 用户界面1|活跃|时间戳1|
| 用户界面1|未激活|时间戳2|
| 用户界面2|无效|时间戳3|
| 用户界面2|活跃|时间戳4|
| UUI3|无效|时间戳3|
| UUI3|活跃|时间戳4|
| UUI4|无效|时间戳3|
| UUI4|活跃|时间戳4|
| UUI5|活跃|时间戳3|
| UUI5|未激活|时间戳4|
哪个查询提供了下表(包含parent_id1和parent_id2的组)

**因此,具有相同parent_id1和parent_id2的文档是同一文档的不同版本,因此我们只对基于时间戳的最新版本感兴趣。**我们还需要基于时间戳的历史记录表中的最新状态(一对多)

| 身份证|版本名|参数标识1|父标识2|时间戳|地位|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 用户界面2|B|1个|一百|时间戳2|活跃|
| UUI5|E级|第二章|一百|时间戳5|未激活|

plicqrtu

plicqrtu1#

使用inner joingroup by,我们可以执行以下操作:

select h3.*, h2.status
from history h2
inner join (
  select t.id, t.version_name, t.parnet_id1, t.parent_id2, max(h.timestamp) as timestamp
  from history h
  inner join (
    select d.id, d.version_name, d.parnet_id1, d.parent_id2
    from document d
    inner join (
      select parnet_id1, parent_id2, max(timestamp) as timestamp
      from document
      group by parnet_id1, parent_id2
    ) as s on s.parnet_id1 = d.parnet_id1 and s.parent_id2 = d.parent_id2 and s.timestamp = d.timestamp
  ) t on t.id = h.document_id
  group by t.id, t.version_name, t.parnet_id1, t.parent_id2
) as h3 on h2.document_id = h3.id and h3.timestamp = h2.timestamp

Demo here

相关问题