Сценарий: у пользователя есть подписка, в которой размер продукта может быть обновлен. В результате получается следующий набор данных
With subscriptions as (
SELECT "{\"currentSize\":\"2\", \"sizeHistory\":[{\"from\":\"1\", \"to\":\"2\", \"timestamp\":{\"_seconds\":1588543200}}], \"createdAt\": {\"_seconds\":1587543200}}" as data,
"docWithSingleHistory" as document_name UNION ALL
SELECT "{\"currentSize\":\"3\", \"sizeHistory\":[{\"from\":\"1\", \"to\":\"2\", \"timestamp\":{\"_seconds\":1588543200}}, {\"from\":\"2\", \"to\":\"3\", \"timestamp\":{\"_seconds\":1589543200}}], \"createdAt\": {\"_seconds\":1587543200}}" as data,
"docWithMoreHistory" as document_name UNION ALL
SELECT "{\"currentSize\":\"3\", \"createdAt\": {\"_seconds\":1587543200}}" as data,
"docWithoutHistory" as document_name
)
select document_name, data from subscriptions
Вот более наглядный пример
Подписка имеет текущий размер и необязательную историю размеров, которая содержит обновления и когда они были сделаны.
Мои цели:
- получить начальный размер каждой подписки. Если истории нет, это будет метка времени createdAt. Если есть история, это будет значение «from» элемента массива sizeHistory. Самая низкая отметка времени.
- получить среднее значение времени, которое требуется для go перехода от одного размера к другому.
Я уже застрял на первом голе, даже не считая подписку без истории. Вот что у меня есть
With subscriptions as (
SELECT "{\"currentSize\":\"2\", \"sizeHistory\":[{\"from\":\"1\", \"to\":\"2\", \"timestamp\":{\"_seconds\":1588543201}}], \"createdAt\": {\"_seconds\":1587543200}}" as data,
"docWithSingleHistory" as document_name UNION ALL
SELECT "{\"currentSize\":\"3\", \"sizeHistory\":[{\"from\":\"1\", \"to\":\"2\", \"timestamp\":{\"_seconds\":1588543202}}, {\"from\":\"2\", \"to\":\"3\", \"timestamp\":{\"_seconds\":1589543200}}], \"createdAt\": {\"_seconds\":1587543200}}" as data,
"docWithMoreHistory" as document_name UNION ALL
SELECT "{\"currentSize\":\"3\", \"createdAt\": {\"_seconds\":1587543200}}" as data,
"docWithoutHistory" as document_name
)
select
document_name,
JSON_EXTRACT_SCALAR(sizeHistory, "$.from") as start_size,
JSON_EXTRACT_SCALAR(sizeHistory, "$.timestamp['_seconds']") as timestamp,
from (
select MIN(JSON_EXTRACT(sizeHistoryDoc, "$.timestamp['_seconds']")) as minStartDate
from subscriptions, UNNEST(JSON_EXTRACT_ARRAY(data, "$.sizeHistory")) as sizeHistoryDoc
), subscriptions, UNNEST(JSON_EXTRACT_ARRAY(data, "$.sizeHistory")) as sizeHistory
where JSON_EXTRACT_SCALAR(sizeHistory, "$.timestamp['_seconds']") = minStartDate
Основная причина заключалась в следующем: для каждой подписки получить соответствующий элемент sizeHistory с минимальной отметкой времени. Проблема в том, что условие where выполняется для всего набора данных, поэтому я получаю только одну подписку (с минимальной отметкой времени).
Вот пример моей идеальной структуры результатов (не основанной на фиктивных данных предоставлено выше):
| ------------------------------------ |
| start size | number of subscriptions |
| -------------------------------------|
| 1 | 2 |
| 2 | 10 |
| -------------------------------------|
| -----------------------------------------------------------|
| change | number of subscriptions | AVG days to change |
| -----------------------------------------------------------|
| 1 to 2 | 5 | 30 |
| 2 to 3 | 2 | 20 |
| -----------------------------------------------------------|
Я застрял на этом уже несколько дней, поэтому любое решение / помощь / подсказка были бы действительно полезны.