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
);
我有一个 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
);