我为美国市场提供了一个简单的SQL日志表(在SQLite中名为SQLite),如下所示:
样本表(market_history)
id datetime market percent
1 9/5/2014 7:50 ARIZONA 50.0
2 9/5/2014 7:50 ATLANTA 97.4
3 9/5/2014 7:50 AUSTIN 78.8
4 9/5/2014 7:50 BOSTON 90.9
6 9/5/2014 7:50 CHARLOTTE 100.0
7 9/5/2014 7:50 CHICAGO 90.3 此表是每个市场不同系统的网络容量的每小时快照。我想做的是建立一个警报系统,如果任何一个特定的市场连续超过2个小时(每一行记录一小时)低于阈值百分比(比如50%),它就会触发一封警报电子邮件。因此,查询应该向我显示一个唯一的市场名称列表,其中的百分比为< 50.0,超过了最近的两个连续条目
这是我正在尝试的SQL,但它不起作用:
示例SQL (不工作):
SELECT
mh.datetime, mh.market, mh.percent
FROM markets_history mh
WHERE
(SELECT mh1.precent FROM markets_history mh1 WHERE mh1.datetime BETWEEN "2015-03-23 00:00:00" AND "2015-03-23 00:59:59" AND mh.market=mh1.market ) < 50 AND (SELECT mh2.precent FROM markets_history mh2 WHERE mh2.datetime BETWEEN "2015-03-23 01:00:00" AND "2015-03-23 01:59:59" AND mh.market=mh2.market ) < 50
ORDER by mh.datetime我知道我错过了什么..。任何建议
发布于 2015-03-23 19:50:24
如果时间窗口是固定的和可靠的,只需确保最大的窗口不超过阈值。如果您需要将其扩展到两个以上,那么您看上去也不重要。
select market
from markets_history mh
where mh.datetime between <last_two_hours> and <now>
group by mh.market
having max(percent) < 50.0
-- and count(*) = 2 /* if you need to be sure of two ... */发布于 2015-03-23 19:41:35
下面是一种应该在SQLite中工作的方法。在每个市场找到最后一个好的身份(如果有的话)。然后计算大于id的行数。
select lastgood.market,
sum(case when lastgood.market is null then 1
when lastgood.id < mh.id then 1
else 0
end) as NumInRow
from market_history mh left join
(select market, max(id) as maxid
from market_history mh
where percent < 50.0
group by market
) as lastgood
on lastgood.market = mh.market and lastgood.id < mh.id;这个查询有点复杂,因为它需要考虑到没有任何好id的可能性。如果是这样的话,那么市场上的所有行都会计算在内。
https://stackoverflow.com/questions/29218833
复制相似问题