簡體   English   中英

從給定日期選擇過去和將來的值

[英]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

要使用進行測試的SQLfiddle

如果您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM