pgsql:Select 个具有最新时间戳的不同唯一列

pgsql: Select different unique columns with newest timestamp

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

很难解释,所以这里有一个例子:

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

[('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 尝试了一些东西,但我无法让它工作。

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

这可以通过 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 通常比使用 window 函数的解决方案更快。

找到 "most recent one" 总是可以用 不存在更新的 :

来表示
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
        );