【PostgreSQL】使用开窗函数获取历史表最新记录 及 MySQL 旧版本实现
在PostgreSQL中,可以使用开窗函数(window functions)来获取历史表中每个实体的最新记录。以下是一个示例,假设有一个history_table
,它记录了实体的变更历史,并且每个实体都有一个id
字段和一个表示变更时间的timestamp
字段。
SELECT h.*
FROM (
SELECT
id,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp DESC) AS rn
FROM
history_table
) subquery
JOIN history_table h ON subquery.id = h.id AND subquery.rn = 1;
在这个查询中,我们首先为每个id
分区,并按照timestamp
字段降序排列,为每条记录分配一个行号(rn
)。然后,我们通过内部的子查询和外部的JOIN操作,选择每个id
分区中rn
为1的记录,即每个实体的最新记录。
在MySQL中,如果你使用的是较旧的版本,不支持开窗函数,你可以使用以下方法:
SELECT ht.*
FROM history_table ht
INNER JOIN (
SELECT id, MAX(timestamp) AS max_timestamp
FROM history_table
GROUP BY id
) subquery ON ht.id = subquery.id AND ht.timestamp = subquery.max_timestamp;
在这个查询中,我们首先为每个id
计算最大的timestamp
,然后使用这个信息来选择原始表中的记录,以获得每个实体的最新记录。这种方法在不支持开窗函数的MySQL版本中有效。
评论已关闭