PostgreSQL查询:根据设备的另一个参数值选择设备及其一个参数
我有一个名为Configuration的表。表的第一列是deviceId,第二列是parameter,第三列是value 表中有很多设备,每个设备只有一个设备ID列1;每个设备都有许多配置参数Column 2、ex.VER、DATE等,所有设备都有相同的配置参数;不同设备的参数值第3列可能相同或不同 我想为日期值大于“2019-05-01”的设备选择所有设备的配置参数VERPostgreSQL查询:根据设备的另一个参数值选择设备及其一个参数,sql,postgresql,Sql,Postgresql,我有一个名为Configuration的表。表的第一列是deviceId,第二列是parameter,第三列是value 表中有很多设备,每个设备只有一个设备ID列1;每个设备都有许多配置参数Column 2、ex.VER、DATE等,所有设备都有相同的配置参数;不同设备的参数值第3列可能相同或不同 我想为日期值大于“2019-05-01”的设备选择所有设备的配置参数VER 如何在一个PostgreSQL查询中实现这一点 一种选择是使用计数作为分析函数来识别匹配的设备: WITH cte AS
如何在一个PostgreSQL查询中实现这一点 一种选择是使用计数作为分析函数来识别匹配的设备:
WITH cte AS (
SELECT deviceId, parameter, value,
COUNT(*) FILTER (WHERE parameter = 'DATE' AND value > '2019-05-01') OVER
(PARTITION BY deviceId) cnt
FROM yourTable
)
SELECT parameter, value
FROM cte
WHERE parameter = 'VER' AND cnt > 0;
另一种方法是通过exists查询:
SELECT parameter, value
FROM yourTable t1
WHERE
parameter = 'VER' AND
EXISTS (SELECT 1 FROM yourTable t2
WHERE t1.deviceId = t2.deviceId AND
t2.parameter = 'DATE' AND
t2.value > '2019-05-01');
谢谢Tim,SELECT 1在exists查询中是什么意思:@leilei您可能认为SELECT 1只是一个虚拟SELECT。我们并不真正关心被选择的内容,因为EXISTS只是检查是否存在任何类型的记录。@leilei:你也可以写select*或选择“这被忽略”——实际上在Postgres中你甚至可以写select from。。。没有任何列名。@没有列名的马不知道从中选择。。。很好的注释:-您甚至可以使用select 1/0来证明该值被完全忽略。