查找15分钟间隔的数据集中的最后一个值

时间:2015-09-24 05:01:06

标签: mysql sql sap hana

ID Timestamp Value                                                               
   1   11:59.54   10

   1   12.04.00   20

   1   12.12.00   31

   1   12.16.00   10

   1   12.48.00   05

我希望结果集为

ID Timestamp Value

 1   11:59.54   10

   1   12:00:00   10

   1   12.04.00   20

   1   12.12.00   31

   1   12:15:00   31

   1   12:16.00   10

   1   12:30:00   10

   1   12:45:00   10

   1   12.48.00   05

2 个答案:

答案 0 :(得分:3)

更多咖啡可能会带来更简单的解决方案,但请考虑以下内容......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,timestamp TIMESTAMP
,value INT NOT NULL
);

INSERT INTO my_table VALUES
(1   ,'11:59:54',10),
(2   ,'12:04:00',20),
(3   ,'12:12:00',31),
(4   ,'12:16:00',10),
(5   ,'12:48:00',05);

...另外,我有一个整数表,看起来像这样:

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

所以......

SELECT a.timestamp
     , b.value
  FROM 
     ( SELECT x.*
            , MIN(y.timestamp) min_timestamp
         FROM 
            ( SELECT timestamp
                FROM my_table
               UNION
              SELECT SEC_TO_TIME((i2.i*10+i1.i)*900)
                FROM ints i1
                   , ints i2 
               WHERE SEC_TO_TIME((i2.i*10+i1.i)*900) 
                     BETWEEN (SELECT MIN(timestamp) FROM my_table) 
                         AND (SELECT MAX(timestamp) FROM my_table) 
               ORDER 
                  BY timestamp
            ) x
         LEFT
         JOIN my_table y
           ON y.timestamp >= x.timestamp
        GROUP 
           BY x.timestamp
    ) a
 JOIN my_table b
   ON b.timestamp = min_timestamp;

+-----------+-------+
| timestamp | value |
+-----------+-------+
| 11:59:54  |    10 |
| 12:00:00  |    20 |
| 12:04:00  |    20 |
| 12:12:00  |    31 |
| 12:15:00  |    10 |
| 12:16:00  |    10 |
| 12:30:00  |     5 |
| 12:45:00  |     5 |
| 12:48:00  |     5 |
+-----------+-------+

答案 1 :(得分:0)

这个想法如下。使用SERIES_GENERATE()以15分钟的间隔生成缺少的时间戳,并将其与表T的现有数据合并。现在,您希望将LAST_VALUEIGNORE NULLS一起使用。 HANA中未实现IGNORE NULLS,因此您必须采取一些解决方法。我使用COUNT()作为window function来计算非空值。我对原始数据做了同样的事情,然后加入计数。这样我就重复了最后一个非空值。

select X.ID, X.TIME, Y.VALUE from (
    select ID, TIME, value, 
        count(VALUE) over (order by TIME rows between unbounded preceding and current row) as CNT 
    from (
        --add the missing 15 minute interval timestamps
        select 1 as ID, GENERATED_PERIOD_START as TIME, NULL as VALUE 
        from SERIES_GENERATE_TIME('INTERVAL 15 MINUTE', '12:00:00', '13:00:00')
        union all 
        select ID, TIME, VALUE from T
    )
) as X join (
    select ID, TIME, value, 
           count(value) over (order by TIME rows between unbounded preceding and current row) as CNT
    from T
) as Y on X.CNT = Y.CNT