当出现故障时,获取时间戳中的 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
?>
值存储在带有时间戳的表中。 因此,在一天之内,我们可以有一段时间的消费和加载。 值以百分比为单位。
目标是找出每个Spending
的MIN
和MAX
之间的差异,并忽略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 行的主要内容,如果未能解决你的问题,请参考以下文章
从 postgres 中的子网/掩码获取 MAX 和 MIN ip
了解scikit CountVectorizer中的min_df和max_df