Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当发生故障时,获取时间戳中的最小行数和最大行数_Php_Sql_Max_Min_Between - Fatal编程技术网

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;