分组值在 SQL (maria DB) 中按时间存储直到零,并与计数一起进行求和
Posted
技术标签:
【中文标题】分组值在 SQL (maria DB) 中按时间存储直到零,并与计数一起进行求和【英文标题】:Group values stores against time in SQL (maria DB) until Zero and do a summation along with count 【发布时间】:2022-01-04 06:56:16 【问题描述】:我有一个 SQL 表,它以 15 分钟的间隔存储一个变量(唯一键)的数据。该值可以是每个时间间隔的任何数字,包括零。想要根据唯一键将值分组到零。
就像如果值是 0,0,100,900,30,0,0,0,400,900,100,0,0,0,0,400,500,0,0 随着时间的推移想要添加值直到零(比如总和为 1030、1400、900、. .. ) 针对每个唯一键,并计算值不为零的实例数(如在本例中为 3 等)。
我们在 SQL (mariaDB) 中存储了与时间(15 分钟间隔)相关的数据。现在这个数据决定了一个实体的性能,它是秒(就像 15 分钟间隔内的秒数一样,它存在可以取 0 到 900 之间的任何值的问题)。现在我们可以在任何时间间隔内对它们进行分组并轻松绘制受影响的总秒数
Parameter_health 数据库包含两个表 --
-
Parameter_detail 表包含针对参数的固定数据信息
Parameter_uasvalue 表包含每 15 分钟间隔的不可用秒 (UAS) 与该参数的时间对比
我使用了如下 SQL 查询,它是组合在一起的总 UAS 的总和,但我想将它们分组到下一个零值,并计算此类事件的总实例(不是非零事件,而是总事件当它不为零时)对于任何间隔。
在 Grafana 中使用以下查询
SELECT parameter_detail.system, parameter_detail.parameter_label, sum(parameter_uasvalue.uas) as 'Total UAS'
FROM parameter_health.parameter_uasvalue left join parameter_health.parameter_detail on parameter_detail.id=parameter_uasvalue.id
WHERE $__timeFilter(parameter_uasvalue.time) and parameter_uasvalue.uas != '-1' and parameter_uasvalue.uas !=' 0'
GROUP BY parameter_detail.system, parameter_detail.parameter_label
想要将每个值分组直到零(求和),然后在 sql 查询中对任何时间间隔的此类实例进行计数。 parameter_uasvalue表的表结构如下图
id time uas
Parameter-Unique Value1 15/11/2021 0:00 0
Parameter-Unique Value1 15/11/2021 0:15 100
Parameter-Unique Value1 15/11/2021 0:30 900
Parameter-Unique Value1 15/11/2021 0:45 30
Parameter-Unique Value1 15/11/2021 1:00 0
Parameter-Unique Value1 15/11/2021 1:15 0
Parameter-Unique Value1 15/11/2021 1:30 400
Parameter-Unique Value1 15/11/2021 1:45 900
Parameter-Unique Value1 15/11/2021 2:00 0
Parameter-Unique Value1 15/11/2021 2:15 0
Parameter-Unique Value1 15/11/2021 2:30 0
Parameter-Unique Value1 15/11/2021 2:45 400
Parameter-Unique Value1 15/11/2021 3:00 500
Parameter-Unique Value1 15/11/2021 3:15 0
Parameter-Unique Value1 15/11/2021 3:30 0
Parameter-Unique Value1 15/11/2021 3:45 0
enter image description here
【问题讨论】:
请以表格形式分享您的表格结构和样本值。 @KaziMohammadAliNur 使用您要求的详细信息编辑了我的查询,希望对您有所帮助 谢谢。如果您可以上传文本格式的值,那就太好了,这样我就可以重新创建场景。 @KaziMohammadAliNur 谢谢,我已经添加了。另一个表是参数的其他详细信息,通常是固定信息,我们在查询中加入它们 【参考方案1】:这是一种差距和孤岛问题。首先处理和分组parameter_uasvalue
数据,然后加入Parameter_detail
。
SELECT d.system, d.parameter_label, seriesStart, s, nonzc
from (
select id, min(time) seriesStart, sum(uas) s, count(case when uas > 0 then uas end) nonzc
from (
select id, time, uas, sum(flag) over(partition by id order by time) grp
from (
select id, time, uas, (coalesce(lag(uas, 1) over(partition by id order by time),0) = 0 and uas != 0) flag
from parameter_health.parameter_uasvalue t
where $__timeFilter(time) and uas != -1
-- it will break series detection
-- and uas != 0
) t
) t
group by id, grp
) t
left join parameter_health.parameter_detail d on d.id=t.id
order by d.system, d.parameter_label, seriesStart;
Grouping demo
【讨论】:
感谢您的帮助,但我是 SQL 新手,所以我对所提供的语句感到困惑,我不确定我应该引用哪个 id,因为有两个带有 ID 字段的表,在哪里我应该应用实际时间过滤器吗?“t”表示什么。如果你能在上面指导我,那就太好了。我确实尝试了几个选项,但我收到错误指示 sql 查询中的错误 @Ramanan,查看编辑后的答案 不幸的是,我认为我不能使用它,因为我们面临服务器超时错误,只有 51 天的数据,可能我们可能需要将其移动到时间序列数据库以上是关于分组值在 SQL (maria DB) 中按时间存储直到零,并与计数一起进行求和的主要内容,如果未能解决你的问题,请参考以下文章