pgsql:选择具有最新时间戳的不同唯一列

时间:2015-07-16 10:35:40

标签: sql postgresql timestamp greatest-n-per-group

我有一个包含列的psql表:write_date,tagwaarde,tagnaam,tagkwaliteit,schrijven。 我现在需要做的是只检索每个列的最新唯一值,其中" schrijven"是的。

很难解释所以这里有一个例子: enter image description here

在这种情况下,我想要这个输出:

[('Bakkerij.Device1.DB100INT0', 777), ('Bakkerij.Device1.DB100INT8', 0)]

由于:

Bakkerij.Device1.DB100INT0 = 777和Bakkerij.Device1.DB100INT0 = 666

=> 777具有最新的时间戳

我试过了SELECT tagnaam, tagwaarde FROM inlezen WHERE schrijven = True ORDER BY write_date DESC LIMIT 1

这只是

[('Bakkerij.Device1.DB100INT8', 0)]

作为输出。

我已经尝试过DISTINCT的一些东西,但是我无法让它发挥作用。

解决这个问题的正确方法是什么? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

这可以通过Postgres'distinct on ()运算符完成:

SELECT distinct on (tagnaam) tagnaam, tagwaarde 
FROM inlezen 
WHERE schrijven = True 
ORDER BY tagnaam, write_date DESC

如果您更喜欢标准的ANSI SQL解决方案,那么可以使用window function

来完成
select tagnaam, tagwaarde
from (
    SELECT tagnaam, tagwaarde, 
           row_number() over (partition by tagnaam order by write_date DESC) as rn
    FROM inlezen 
    WHERE schrijven = True 
) t
where rn = 1
order by tagnaam;

distinct on通常比具有窗口功能的解决方案更快。

答案 1 :(得分:0)

找到"最近的一个"总是可以用表示,不存在更新的

SELECT tagnaam, tagwaarde 
FROM inlezen lz
WHERE lz.schrijven = True
AND NOT EXISTS (
        SELECT * FROM inlezen nx
        WHERE nx.tagnaam = lz.tagnaam
        AND nx.schrijven = True
        AND nx.write_date > lz.write_date
        );