Php 当发生故障时,获取时间戳中的最小行数和最大行数
我有这样一个结果:Php 当发生故障时,获取时间戳中的最小行数和最大行数,php,sql,max,min,between,Php,Sql,Max,Min,Between,我有这样一个结果: <?php // 56.39 Spending // 54.35 Spending // 52.32 Spending // 50.30 Spending // 48.29 Spending // 46.29 Spending // 44.27 Spending // 42.25 Spending // 40.23 Spending // 38.22 Spending // 36.1
<?php
// 56.39 Spending
// 54.35 Spending
// 52.32 Spending
// 50.30 Spending
// 48.29 Spending
// 46.29 Spending
// 44.27 Spending
// 42.25 Spending
// 40.23 Spending
// 38.22 Spending
// 36.19 Spending
// 34.19 Spending
// 32.15 Spending
// 34.66 Loading
// 36.99 Loading
// 38.99 Loading
// 40.01 Loading
// 42.03 Loading
// 44.04 Loading
// 46.10 Loading
// 48.12 Loading
// 50.19 Loading
// 52.22 Loading
// 54.26 Loading
// 56.27 Loading
// 58.30 Loading
// 60.32 Loading
// 62.34 Loading
// 64.40 Loading
// 66.42 Loading
// 68.50 Loading
// 70.51 Loading
// 72.55 Loading
// 74.57 Loading
// 76.60 Loading
// 74.57 Spending
// 72.55 Spending
// 70.53 Spending
// 68.53 Spending
// 66.53 Spending
// 64.43 Spending
// 62.12 Spending
?>
这一天在的总花费为24,24+14,45=38,69%
如何在PHP中实现这一点
The table is like | TIMESTAMP | VALUE
谢谢这是一个缺口和孤岛问题的例子。您可以在SQL中完成这一切 关键是确定相邻的“支出”组。行号的差异是一种方便的方法。其余的只是先将每个“岛”聚合起来,然后在一天之内:
select dte, sum(max_spending - min_spending)
from (select date(timestamp) as dte, min(timestamp) as min_ts, max(timestamp) as max_ts,
min(value) as min_spending, max(value) as max_spending
from (select t.*,
row_number() over (partition by date(timestamp) order by timestamp) as seqnum,
row_number() over (partition by date(timestamp), type order by timestamp) as seqnum_s
from t
) t
where value = 'SPENDING'
group by date(timestamp), seqnum - seqnum_s
) t
group by dte;
为什么这样做有点难解释。如果查看最里面的子查询,您将看到两个序列号。您还应该能够看到,当原始数据中的值相邻时,差异是恒定的。欢迎Eduardo,您是如何选择56,39和32,15的?我不确定您在这里问什么,如果您更详细地解释您的问题,可能会有所帮助。我的数据库只有两行:时间戳和一个值。这些值在上升或下降。在某个特定的时间段内(永远不知道),值正在下降。。。我可以称之为“消磨”时间。然后,我们必须重新填充,数值开始上升。。当它停止上升时,它又开始进入消费时间。所以,56,39是接近午夜的第一个值。在32.15%之前,它一直在消耗,我们必须重新注满油箱,因为下一个值更高。直到76,60%,所以我必须计算当天花费的百分比(所有这些行都是从一天开始的56,39和32,15是一天中我们知道有花费时间的第一个时刻。我必须计算它。然后还有另一个时刻……我们必须找到它们之间的差异2,并将其相加,以得到那天花费的总数=74.57和62.12。看起来是一个岛屿和缺口问题。首先,你需要o唯一标识每组支出,然后您可以得到spendingI不理解您的查询的平均值:type='spending'我没有该列。单词spending和Loading只是注释,这样您就可以理解,如果级别下降,它就是支出……如果级别上升,它就是加载。
select dte, sum(max_spending - min_spending)
from (select date(timestamp) as dte, min(timestamp) as min_ts, max(timestamp) as max_ts,
min(value) as min_spending, max(value) as max_spending
from (select t.*,
row_number() over (partition by date(timestamp) order by timestamp) as seqnum,
row_number() over (partition by date(timestamp), type order by timestamp) as seqnum_s
from t
) t
where value = 'SPENDING'
group by date(timestamp), seqnum - seqnum_s
) t
group by dte;