【发布时间】:2016-11-22 18:51:39
【问题描述】:
我正在监控物联网应用中温度控制器的有效性。我试图在时间序列中找到“有趣的点”。这些类似于局部最小值或最大值,但包括趋势开始时曲线上的点。这不仅仅是最小值和最大值。它是一个小时内发生 5 个点的范围。
来源
| inMins | unixTime | temp |
|--------|------------------|------|
| 0 | 1479042000000000 | 10.0 |
| 5 | 1479042300000000 | 11.0 |
| 10 | 1479042600000000 | 12.0 |
| 15 | 1479042600000000 | 13.0 |
| 20 | 1479043200000000 | 14.0 |
| 25 | 1479043500000000 | 15.0 |
| 30 | 1479043800000000 | 14.0 |
| 35 | 1479044100000000 | 13.0 |
| 40 | 1479044400000000 | 12.0 |
| 45 | 1479044700000000 | 11.0 |
| 50 | 1479045000000000 | 10.0 |
| 55 | 1479045300000000 | 9.0 |
| 60 | 1479045600000000 | 8.0 |
| 65 | 1479045900000000 | 9.0 |
| 70 | 1479046200000000 | 10.0 |
| 75 | 1479046500000000 | 11.0 |
| 80 | 1479046800000000 | 12.0 |
| 85 | 1479047100000000 | 13.0 |
| 90 | 1479047400000000 | 14.0 |
想要的形状
| inMins | unixTime | temp | coldOrHot |
|--------|------------------|------|-----------|
| 0 | 1479042000000000 | 10.0 | 1 |
| 25 | 1479043500000000 | 15.0 | 2 |
| 30 | 1479043800000000 | 14.0 | 2 |
| 35 | 1479044100000000 | 13.0 | 2 |
| 60 | 1479045600000000 | 8.0 | 1 |
| 65 | 1479045900000000 | 9.0 | 1 |
我目前的结果有些问题
| inMins | unixTime | temp | coldOrHot |
|--------|------------------|------|-----------|
| 25 | 1479043500000000 | 15.0 | 2 |
| 30 | 1479043800000000 | 14.0 | 2 |
| 60 | 1479045600000000 | 8.0 | 1 |
| 65 | 1479045900000000 | 9.0 | 1 |
| 70 | 1479046200000000 | 10.0 | 1 |
| 75 | 1479046500000000 | 11.0 | 1 |
| 80 | 1479046800000000 | 12.0 | 1 |
| 85 | 1479047100000000 | 13.0 | 1 |
| 90 | 1479047400000000 | 14.0 | 1 |
SQL
Select
inMins,
unixTime,
temp,
coldOrHot
from
(Select
inMins,
unixTime,
temp,
-- 1 means Cold, 2 means Hot, 0 is noise
if(temp=theLowInWindowDesc,1,
if(temp=theHighInWindowDesc,2,0)) as coldOrHot,
theHighInWindowDesc,
theLowInWindowDesc
FROM
(SELECT
inMins,
unixTime,
temp,
theHighInWindowDesc,
theLowInWindowDesc
FROM
(Select
inMins,
unixTime,
temp,
MAX(temp) OVER(ORDER BY
unixTime desc RANGE BETWEEN 60 * 60 * 1000000 PRECEDING
AND CURRENT ROW) AS theHighInWindowDesc,
MIN(temp) OVER(ORDER BY
unixTime desc RANGE BETWEEN 60 * 60 * 1000000 PRECEDING
AND CURRENT ROW) AS theLowInWindowDesc
FROM
[esheetzbq:findingLocalExtrema.timeSeriesForKevin]
ORDER BY
inMins asc
)
)
)
where coldOrHot=1 or coldOrHot=2
问题
- 当温度为 10 并在 25 分钟内增加 5 点时,我没有在第 0 分钟接受“冷”
- 我没有在第 35 分钟获得“热”值。
- 从 70 分钟到 90 分钟的结果没有考虑到我的 5 分范围标准,并且正在发生,因为我当前的逻辑是基于极端而不是范围。 ""OVER"" 的 SQL 窗口函数在数据集的最后一小时中提取不到一小时的行。这是预期的行为,我不确定哪种逻辑最适合排除给出警告但没有看到 5 分范围的记录。
- 这会扩展吗?我将在大约 34M 行的记录集上运行这个逻辑。
【问题讨论】:
-
我不明白“一小时 5 分”与此有什么关系。看起来您只是在寻找单调的点。
-
您能解释一下为什么 inMins=30 在您的输出中吗?
-
你应该澄清你的逻辑 - 否则对于我们任何真正想帮助你应对挑战的人来说,它都是悬而未决的
-
听起来我的问题可以写得更好。让我看看这是否有助于澄清。 inMins=30 符合条件,因为温度在反转之前又继续下降了 5 点。因此,它不仅仅是时间范围内的最小值和最大值,而是温度移动 5 个点范围内的点。从 25 分钟到 50 分钟,温度下降了 5 点,从 30 分钟到 55 分钟,温度也下降了 5 点。我被要求做的不仅仅是找到局部最小值和最大值,还要找到符合范围标准的趋势点。
-
所以,根据我目前听到的情况,我预计也会看到 inMins=35、40 等,因为它们也在 5 点趋势之内!但是,它们不在您想要的输出中。因此,这意味着您的脑海中还有一些其他东西在您的逻辑中无法描述
标签: sql google-bigquery