Time-series alignment with interpolation

DROP TABLE test_ts_interpolation;

--- generate test data

CREATE TABLE test_ts_interpolation
ENGINE = Log AS
SELECT
    ((number * 100) + 50) - (rand() % 100) AS timestamp,
    transform(rand() % 2, [0, 1], ['A', 'B'], '') AS ts,
    if(ts = 'A', timestamp * 10, timestamp * 100) AS value
FROM numbers(1000000);


SELECT * FROM test_ts_interpolation;

-- interpolation select with window functions

SELECT 
    timestamp,
    if(
        ts = 'A',
        toFloat64(value),
        prev_a.2 + (timestamp - prev_a.1 ) * (next_a.2 - prev_a.2) / ( next_a.1 - prev_a.1)
    ) as a_value,
    if(
        ts = 'B',
        toFloat64(value),
        prev_b.2 + (timestamp - prev_b.1 ) * (next_b.2 - prev_b.2) / ( next_b.1 - prev_b.1)
    ) as b_value
FROM 
(
    SELECT 
        timestamp,
        ts,
        value,
        anyLastIf((timestamp,value), ts='A') OVER (ORDER BY timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS prev_a,
        anyLastIf((timestamp,value), ts='A') OVER (ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS next_a,
        anyLastIf((timestamp,value), ts='B') OVER (ORDER BY timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS prev_b,
        anyLastIf((timestamp,value), ts='B') OVER (ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS next_b
    FROM 
    test_ts_interpolation
)
Last modified 2021.09.03: Create ts-interpolation.md (15941a3)