Объединить два JSON столбца массива в Mysql 8 - PullRequest
1 голос
/ 29 апреля 2020

Я использую Mysql (версия> 8).

У меня есть таблица, в которой я храню уникальные идентификаторы клиентов за день в поле JSON в виде массива.

Мне нужно запросить всех уникальных клиентов за последние 30 дней. Я не могу найти эквивалентный mysql запрос для того же.

Я использую JSON_ARRAYAGG, чтобы сначала объединить все массивы, а затем я использую ruby, чтобы сгладить массив и найти уникальные значения.

Пример запроса:

SELECT 
    JSON_ARRAYAGG(customers) as customers, 
    name 
FROM `source_type_daily_metrics` 
WHERE 
    `source_type_daily_metrics`.`merchant_id` = 29 
    AND (date >= curdate() - interval 30 day) 
GROUP BY `source_type_daily_metrics`.`name`

1 Ответ

1 голос
/ 29 апреля 2020

Вы можете использовать json_table(), чтобы развернуть массивы как строки, а затем json_arrayagg(), чтобы агрегировать обратно:

select s.name, json_arrayagg(t.cust) customers
from source_type_daily_metrics s
cross join json_table(s.customers, '$[*]' columns (cust int path '$')) t
where s.merchant_id = 29 and date >= current_date - interval 30 day
group by s.name

Если в массивах есть повторяющиеся идентификаторы клиентов, и вы хотите, чтобы в набор результатов, то вам нужен дополнительный уровень агрегирования (поскольку, к сожалению, json_arrayagg() не поддерживает distinct):

select name, json_arrayagg(cust) customers
from (
    select distinct s.name, t.cust
    from source_type_daily_metrics s
    cross join json_table(s.customers, '$[*]' columns (cust int path '$')) t
    where s.merchant_id = 29 and date >= current_date - interval 30 day
) t
group by s.name
...