首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算PostgreSQL中的布尔更改

如何计算PostgreSQL中的布尔更改
EN

Stack Overflow用户
提问于 2020-05-23 08:12:16
回答 2查看 90关注 0票数 1

我的桌子看起来像这样

目标是计算特定执行器的actuator_state (来自列actuator_names)在一段时间内更改了多少次。请记住,一个特定的执行器有各种执行器(例如,加热器有Heator0、Heator1等),目标是计算有多少次更改了Heater0+ Heater1+ Heator2+ Heater3……(表的名称也是state_actuator

我试过这个:

代码语言:javascript
复制
SELECT actuator_nome AS NOME, 
SUM (DISTINCT CASE WHEN  actuator_state.actuator AND DISTINCT actuator_state.actuator_time AND DISTINCT actuator_state.actuator_state THEN 1 ELSE 0) AS TROCAS_ESTADO
FROM actuator_state WHERE actuator_time BETWEEN '2020-05-17 16:58:54' AND '2020-05-17 17:09:58' AND actuator_name='Heater'  

结果应该是加热器: 5;(例如,Heater0更改了3次,Heater1更改了2次,其他加热器0更改了)

EN

回答 2

Stack Overflow用户

发布于 2020-05-23 08:18:12

您可以使用窗口函数来执行以下操作:

代码语言:javascript
复制
select 
    actuator_name,
    count(*) filter(where actuator_state <> lag_actuator_state) no_changes
from (
    select 
        t.*,
        lag(actuator_state) 
            over(partition by actuator_name, actuator order by actuator_time) lag_actuator_state
    from mytable t
    where actuator_time between '2020-05-17 16:58:54' and '2020-05-17 17:09:58'
) t
group by actuator_name

子查询使用lag()来检索每个执行器的“先前”状态。然后,外部查询按actuator_name聚合,并在每次连续值不相等时执行按1递增的计数。

您可以根据需要在子查询的where子句中添加其他筛选器。

请注意,此查询不会将周期中的第一个值计入更改。只考虑进一步的更改。

票数 2
EN

Stack Overflow用户

发布于 2020-05-23 08:17:24

您可以使用lag()

代码语言:javascript
复制
select actuator_name,
       count(*) filter (where prev_as is distinct from actuator_state)
from (select sa.*,
             lag(actuator_state) over (partition by actuator order by actuator_time) as prev_as
      from state_actuator sa
     ) sa
where actuator_time between '2020-05-17 16:58:54' and '2020-05-17 17:09:58'    
group by actuator_name;

您还可以根据where子句中的特定名称进行过滤。

请注意,这会将第一次出现算作“更改”。目前还不清楚这是否符合你的意图。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61965770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档