当出现故障时,获取时间戳中的 Min 和 MAX 行

Posted

技术标签:

【中文标题】当出现故障时,获取时间戳中的 Min 和 MAX 行【英文标题】:Get Min and MAX of rows in a timestamp when there is a down 【发布时间】:2020-04-14 22:56:47 【问题描述】:

我有这样的结果:

<?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
?>

值存储在带有时间戳的表中。 因此,在一天之内,我们可以有一段时间的消费和加载。 值以百分比为单位。

目标是找出每个SpendingMINMAX 之间的差异,并忽略LOADING

所以,在这种情况下,我总共有

56,39-32,15 = 24,24% SPENT
+
74,57-60,12 = 14,45%

这一天的总花费为 24,24+14,45 = 38,69%

我怎样才能在 PHP 中做到这一点?

The table is like | TIMESTAMP | VALUE

谢谢

【问题讨论】:

欢迎 Eduardo,你是如何选择 56,39 和 32,15 的? 我不确定你在这里问什么,如果你能更详细地解释你的问题可能会有所帮助。 我的数据库只有两行:时间戳和一个值。这些价值正在上升或下降。在某个时间段内(永远不知道),价值正在下降......这是我可以称之为“花费”的时间。然后,我们必须重新填充,值开始上升。当它停止上升时,它又开始进入 SPENDING 时间。因此,56,39 是接近午夜的第一个值。它一直花费到 32,15% 然后,我们必须重新填充油箱,因为下一个值更高。直到 76,60% 所以我必须计算当天花费的百分比(所有这些行都是从一天开始的 56,39 和 32,15 是一天中我们知道有消费时间的第一个时刻。我必须计算一下。后来还有一个时刻......我们必须找到它们之间的差异 2 并将其相加得到当天的总花费 = 74.57 和 62.12 看起来像是一个孤岛和差距问题。首先您需要唯一标识每组支出,然后您可以获得支出的平均值 【参考方案1】:

这是一个间隙和孤岛问题的示例。这一切都可以在 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;

为什么这行得通有点难以解释。如果您查看最里面的子查询,您将看到两个连续的数字。您还应该能够看到,当原始数据中的值相邻时,差异是恒定的。

【讨论】:

我不明白您的查询:type='SPENDING' 我没有那个栏目。 Spending 和 Loading 这两个词只是 cmets,因此您可以理解,如果 level 下降,它正在花费……如果 level 上升,它正在加载。

以上是关于当出现故障时,获取时间戳中的 Min 和 MAX 行的主要内容,如果未能解决你的问题,请参考以下文章

JS开发中的一些小技巧和方法

从时间戳中提取时间?

从 postgres 中的子网/掩码获取 MAX 和 MIN ip

了解scikit CountVectorizer中的min_df和max_df

从 PIG 中的数据中获取 MIN EFF_DT 和 MAX_CANC_dt

嵌套列表上的 min/max 函数如何工作?