Requires CB 6.5.0 EE
INSERT INTO default VALUES ("f01",{ "createdAt": "2020-01-01T00:00:00", "closedAt": "2020-01-02T12:00:00" });
INSERT INTO default VALUES ("f02", { "createdAt": "2020-01-01T00:00:00", "closedAt": "2020-01-03T23:59:00" });
SELECT SUM(t.s)/COUNT (DISTINCT t.id) AS avg, t.date
FROM ( SELECT META(d).id, date, SUM(COUNT(dr)) OVER ( PARTITION BY META(d).id ORDER BY date) AS s
FROM default AS d
UNNEST DATE_RANGE_STR(d.createdAt, d.closedAt, "hour") AS dr
LET date = DATE_FORMAT_STR(dr,"1111-11-11")
WHERE d.createdAt IS NOT NULL
GROUP BY META(d).id, date) AS t
GROUP BY t.date;
OR
SELECT SUM(t.s)/COUNT (DISTINCT t.id) AS avg, t.date
FROM (SELECT META(d).id,
date,
SUM(DATE_DIFF_STR(date,d.createdAt,"day")*24+(24-DATE_PART_STR(d.createdAt,"hour"))-CASE WHEN DATE_FORMAT_STR(d.closedAt,"1111-11-11") == date THEN 24-(DATE_PART_STR(d.closedAt,"hour") + CASE WHEN DATE_PART_STR(d.closedAt,"minute") > 0 OR DATE_PART_STR(d.closedAt,"second") THEN 1 ELSE 0 END) ELSE 0 END) AS s
FROM default AS d
UNNEST DATE_RANGE_STR(d.createdAt, d.closedAt, "day") AS dr
LET date = DATE_FORMAT_STR(dr,"1111-11-11")
WHERE d.createdAt IS NOT NULL
GROUP BY META(d).id, date) AS t
GROUP BY t.date;
OR
SELECT
date,
SUM ( (24-DATE_PART_STR(d.createdAt,"hour")) +
(DATE_DIFF_STR(date, d.createdAt,"day") * 24) -
CASE WHEN DATE_FORMAT_STR(d.closedAt,"1111-11-11") == date
THEN 24 - (DATE_PART_STR(d.closedAt,"hour") +
CASE WHEN DATE_PART_STR(d.closedAt,"minute") > 0 OR DATE_PART_STR(d.closedAt,"second")
THEN 1 ELSE 0
END)
ELSE 0
END) / COUNT (DISTINCT META(d).id) AS avg
FROM default AS d
UNNEST DATE_RANGE_STR(d.createdAt, d.closedAt, "day") AS dr
LET date = DATE_FORMAT_STR(dr,"1111-11-11")
WHERE d.createdAt IS NOT NULL
GROUP BY date
ORDER BY date;