要描述我的查询问题,以下数据很有帮助:
单个表包含列ID(int),VAL(varchar)和ORD(int)
VAL的值可能会随着时间的推移而发生变化,ID标识的旧项目不会更新但会附加。 ID的最后一个有效项目由最高的ORD值(随时间增加)确定。
T0,T1和T2是输入数据的时间点。
解决方案不得涉及物化视图等,但应在单个SQL查询中表达。使用Postgresql 9.3。
答案 0 :(得分:5)
在postgres中选择分组最大值的正确方法是使用DISTINCT ON
SELECT DISTINCT ON (id) sysid, id, val, ord
FROM my_table
ORDER BY id,ord DESC;
答案 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 强>