PostgreSQL查询:根据设备的另一个参数值选择设备及其一个参数

PostgreSQL查询:根据设备的另一个参数值选择设备及其一个参数,sql,postgresql,Sql,Postgresql,我有一个名为Configuration的表。表的第一列是deviceId,第二列是parameter,第三列是value 表中有很多设备,每个设备只有一个设备ID列1;每个设备都有许多配置参数Column 2、ex.VER、DATE等,所有设备都有相同的配置参数;不同设备的参数值第3列可能相同或不同 我想为日期值大于“2019-05-01”的设备选择所有设备的配置参数VER 如何在一个PostgreSQL查询中实现这一点 一种选择是使用计数作为分析函数来识别匹配的设备: WITH cte AS

我有一个名为Configuration的表。表的第一列是deviceId,第二列是parameter,第三列是value

表中有很多设备,每个设备只有一个设备ID列1;每个设备都有许多配置参数Column 2、ex.VER、DATE等,所有设备都有相同的配置参数;不同设备的参数值第3列可能相同或不同

我想为日期值大于“2019-05-01”的设备选择所有设备的配置参数VER


如何在一个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来证明该值被完全忽略。