查询历史数据

时间:2015-01-29 17:54:30

标签: sql postgresql

要描述我的查询问题,以下数据很有帮助:

enter image description here

单个表包含列ID(int),VAL(varchar)和ORD(int)

VAL的值可能会随着时间的推移而发生变化,ID标识的旧项目不会更新但会附加。 ID的最后一个有效项目由最高的ORD值(随时间增加)确定。

T0,T1和T2是输入数据的时间点。

  • 如何以有效的方式获得结果集?

解决方案不得涉及物化视图等,但应在单个SQL查询中表达。使用Postgresql 9.3。

3 个答案:

答案 0 :(得分:5)

在postgres中选择分组最大值的正确方法是使用DISTINCT ON

SELECT DISTINCT ON (id) sysid, id, val, ord
FROM my_table
ORDER BY id,ord DESC;

Fiddle

答案 1 :(得分:2)

您想要所有没有新记录的记录:

select *
from mytable
where not exists
(
  select *
  from mytable newer
  where newer.id = mytable.id
  and newer.ord > mytable.ord
)
order by id;

您可以对行号执行相同操作。给每个ID最新的条目1号并保留:

select sysid, id, val, ord
from
(
  select 
    sysid, id, val, ord, 
    row_number() over (partition by id order by ord desc) as rn
  from mytable
)
where rn = 1
order by id;

答案 2 :(得分:1)

在B比A更新的条件下,左()将表(A)连接到自身(B)。仅选择B不存在的行(即A是最近的行)。

SELECT last_value.* 
FROM my_table AS last_value
  LEFT JOIN my_table
    ON my_table.id = last_value.id
    AND my_table.ord > last_value.ord
WHERE my_table.id IS NULL;

<强> SQL Fiddle