我的桌子看起来像这样

目标是计算特定执行器的actuator_state (来自列actuator_names)在一段时间内更改了多少次。请记住,一个特定的执行器有各种执行器(例如,加热器有Heator0、Heator1等),目标是计算有多少次更改了Heater0+ Heater1+ Heator2+ Heater3……(表的名称也是state_actuator
我试过这个:
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更改了)
发布于 2020-05-23 08:18:12
您可以使用窗口函数来执行以下操作:
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子句中添加其他筛选器。
请注意,此查询不会将周期中的第一个值计入更改。只考虑进一步的更改。
发布于 2020-05-23 08:17:24
您可以使用lag()
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子句中的特定名称进行过滤。
请注意,这会将第一次出现算作“更改”。目前还不清楚这是否符合你的意图。
https://stackoverflow.com/questions/61965770
复制相似问题