CREATE TABLE test_uddsketch (
    `id` INT PRIMARY KEY,
    `value` DOUBLE,
    `ts` timestamp time index default now()
);

INSERT INTO test_uddsketch (`id`, `value`) VALUES
    (1, 10.0),
    (2, 20.0),
    (3, 30.0),
    (4, 40.0),
    (5, 50.0),
    (6, 60.0),
    (7, 70.0),
    (8, 80.0),
    (9, 90.0),
    (10, 100.0);

select uddsketch_calc(0.1, uddsketch_state(128, 0.01, `value`)) from test_uddsketch;

select uddsketch_calc(0.5, uddsketch_state(128, 0.01, `value`)) from test_uddsketch;

select uddsketch_calc(0.75, uddsketch_state(128, 0.01, `value`)) from test_uddsketch;

select uddsketch_calc(0.95, uddsketch_state(128, 0.01, `value`)) from test_uddsketch;

SELECT
    ROUND(uddsketch_rank(5, `state`), 4) AS below_min_rank,
    ROUND(uddsketch_rank(10, `state`), 4) AS equal_min_rank,
    ROUND(uddsketch_rank(55, `state`), 4) AS middle_rank,
    ROUND(uddsketch_rank(100, `state`), 4) AS equal_max_rank,
    ROUND(uddsketch_rank(110, `state`), 4) AS above_max_rank
FROM (
    SELECT uddsketch_state(128, 0.01, `value`) AS `state`
    FROM test_uddsketch
);

CREATE TABLE grouped_uddsketch (
    `state` BINARY,
    id_group INT PRIMARY KEY,
    `ts` timestamp time index default now()
);

INSERT INTO grouped_uddsketch (`state`, id_group) SELECT uddsketch_state(128, 0.01, `value`), `id`/5*5 as id_group FROM test_uddsketch GROUP BY id_group;

SELECT uddsketch_calc(0.1, uddsketch_merge(128, 0.01, `state`)) FROM grouped_uddsketch;

SELECT ROUND(uddsketch_rank(55, uddsketch_merge(128, 0.01, `state`)), 4) AS merged_rank
FROM grouped_uddsketch;

CREATE TABLE delta_uddsketch (
    `id` INT PRIMARY KEY,
    `delta` BINARY,
    `persisted` BINARY,
    `ts` timestamp time index default now()
);

INSERT INTO delta_uddsketch (`id`, `delta`, `persisted`)
SELECT 1, uddsketch_state(128, 0.01, `value`), NULL
FROM test_uddsketch WHERE `id` <= 5;

INSERT INTO delta_uddsketch (`id`, `delta`, `persisted`)
SELECT 2, NULL, uddsketch_state(128, 0.01, `value`)
FROM test_uddsketch WHERE `id` > 5;

SELECT
    uddsketch_calc(0.5, __uddsketch_state_delta_merge(128, 0.01, `delta`, `persisted`)) AS merged_p50,
    (SELECT uddsketch_calc(0.5, uddsketch_state(128, 0.01, `value`)) FROM test_uddsketch) AS direct_p50
FROM delta_uddsketch;

-- should fail
SELECT uddsketch_calc(0.1, uddsketch_merge(128, 0.1, `state`)) FROM grouped_uddsketch;

-- should fail
SELECT uddsketch_calc(0.1, uddsketch_merge(64, 0.01, `state`)) FROM grouped_uddsketch;

SELECT uddsketch_rank(55, uddsketch_state(128, 0.01, `value`)) IS NULL AS empty_rank_is_null
FROM test_uddsketch
WHERE `id` < 0;

drop table test_uddsketch;

drop table grouped_uddsketch;
drop table delta_uddsketch;
