我有一个包含列的psql表: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的一些东西,但是我无法让它发挥作用。
解决这个问题的正确方法是什么? 提前谢谢!
答案 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
);