[英]Select past and future values from a given date
我試圖用python編寫一個腳本,該腳本從Data表中提取數據並填充Max表。 對於數據表中的給定數據,腳本應如下所示填充“最大值”表。
Max_f
(f表示未來)是當前一項之后的4項之中的最大值。
Max_p
(p代表過去)是當前一項之前的4項之中的最大值。
項目示例2013-08-13 13:19
:
max_f
將是max_f
和30的最大值。
max_p
將是max_p
和26中的最大值。
前4個max_p
項目和后4個max_f
應該為n / a,因為數據表中沒有足夠的值來計算各自的最大值。
Data Max
id datetime value | id datetime max_f max_p
1 13-Aug-2013 13:15 25 | 1 13-Aug-2013 13:15 27 n/a
2 13-Aug-2013 13:16 23 | 2 13-Aug-2013 13:16 27 n/a
3 13-Aug-2013 13:17 27 | 3 13-Aug-2013 13:17 26 n/a
4 13-Aug-2013 13:18 26 | 4 13-Aug-2013 13:18 28 n/a
5 13-Aug-2013 13:19 25 | 5 13-Aug-2013 13:19 30 27
6 13-Aug-2013 13:20 21 | 6 13-Aug-2013 13:20 31 27
7 13-Aug-2013 13:21 24 | 7 13-Aug-2013 13:21 31 27
8 13-Aug-2013 13:22 28 | 8 13-Aug-2013 13:22 n/a 26
9 13-Aug-2013 13:23 30 | 9 13-Aug-2013 13:23 n/a 28
10 13-Aug-2013 13:24 31 | 10 13-Aug-2013 13:24 n/a 30
11 13-Aug-2013 13:25 29 | 11 13-Aug-2013 13:25 n/a 31
我一直在嘗試使用INTERVAL
進行SELECT
查詢,但是不確定我是否以正確的方式解決了這個問題。
如果有人能指出我正確的方向,那就太好了。
即使絕對不是最高效的查詢類別,也可以這樣做。 該間隔基於前后4分鍾的間隔;
INSERT INTO `max` (`datetime`, `max_f`, `max_p`)
SELECT `data`.datetime,
IF(COUNT(DISTINCT f.datetime) < 4, NULL, MAX(f.value)),
IF(COUNT(DISTINCT p.datetime) < 4, NULL, MAX(p.value))
FROM data
LEFT JOIN data f
ON f.datetime > data.datetime
AND f.datetime < DATE_ADD(data.datetime, INTERVAL 5 MINUTE)
LEFT JOIN data p
ON p.datetime < data.datetime
AND p.datetime > DATE_ADD(data.datetime, INTERVAL -5 MINUTE)
GROUP BY data.datetime
如果您的id
值確實是連續的,則可以執行以下操作:
select d.*,
(case when sum(dnear.id < d.id) = 4
then max(case when dnear.id <= d.id then dnear.value end)
end) as max_p,
(case when sum(dnear.id > d.id) = 4
then max(case when dnear.id >= d.id then dnear.value end)
end) as max_p
from data d left outer join
data dnear
on dnear.id between d.id - 4 and d.id + 4
group by d.id;
簡單子查詢:
SELECT Id,
datetime currdatetime,
(SELECT Max(Value) FROM Data WHERE datetime < currdatetime AND (SELECT COUNT(Value) FROM Data WHERE datetime < currdatetime) > 4) as MaxP,
(SELECT Max(Value) FROM Data WHERE datetime > currdatetime AND (SELECT COUNT(Value) FROM Data WHERE datetime > currdatetime) > 4) as MaxF
FROM Data
如果規范是要從前四行和后四行獲取最大值,而與是否缺少某一分鍾的行無關,則此查詢返回結果集:
SELECT d.id
, IF( ( SELECT 4 AS count_f
FROM `Data` f
WHERE f.datetime > d.datetime
ORDER BY f.datetime ASC
LIMIT 3,1
)
, GREATEST(
( SELECT f1.value FROM `Data` f1
WHERE f1.datetime > d.datetime
ORDER BY f1.datetime ASC LIMIT 0,1
)
, ( SELECT f2.value FROM `Data` f2
WHERE f2.datetime > d.datetime
ORDER BY f2.datetime ASC LIMIT 1,1
)
, ( SELECT f3.value FROM `Data` f3
WHERE f3.datetime > d.datetime
ORDER BY f3.datetime ASC LIMIT 2,1
)
, ( SELECT f4.value FROM `Data` f4
WHERE f4.datetime > d.datetime
ORDER BY f4.datetime ASC LIMIT 3,1
)
)
, 'n/a'
) AS max_f
, IF( ( SELECT 4 AS count_p
FROM `Data` p
WHERE p.datetime < d.datetime
ORDER BY p.datetime DESC
LIMIT 3,1
)
, GREATEST(
( SELECT p1.value FROM `Data` p1
WHERE p1.datetime < d.datetime
ORDER BY p1.datetime DESC LIMIT 0,1
)
, ( SELECT p2.value FROM `Data` p2
WHERE p2.datetime < d.datetime
ORDER BY p2.datetime DESC LIMIT 1,1
)
, ( SELECT p3.value FROM `Data` p3
WHERE p3.datetime < d.datetime
ORDER BY p3.datetime DESC LIMIT 2,1
)
, ( SELECT p4.value FROM `Data` p4
WHERE p4.datetime < d.datetime
ORDER BY p4.datetime DESC LIMIT 3,1
)
)
, 'n/a'
) AS max_p
-- , d.id
-- , d.datetime
-- , d.value
FROM `Data` d
ORDER BY d.id
但是...由於相關的子查詢,這將成為大型集合的調光查詢。 這些子查詢將依賴於以datetime
為前導列的合適索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.