У меня есть одна таблица, как показано ниже. Каждый идентификатор уникален.
и еще одна таблица, подобная этой ↓. В этой второй таблице «id» не уникален, для одного идентификатора существуют разные «category_name».
Я хочу найти разницу между пунктами назначения (category_name) людей, которые часто выходят из дома (times_of_going_out<5), и людьми, которые редко выходят из дома (times_of_going_out<=5).
** Обе таблицы представляют собой небольшую выборку больших таблиц.
・ Куда часто ходят люди, которые дважды выходят на улицу? ・ Куда чаще всего ходят люди, которые выходят 6раз? Спасибо
Ожидаемый результат может быть примерно таким
извини @ahmed, я думал, что Bigquery такой же, как MySQL (да, этот новичок). Я использую BigQuery.
можете ли вы также добавить таблицу ожидаемых результатов, указав также степень детализации
Вы просто хотите суммировать все по названию категории? пожалуйста, поделитесь ожидаемыми результатами из приведенной выше таблицы и добавьте описание
@trillion Я добавляю изображение того, что мне нужно. Спасибо
это не выход, пожалуйста, создайте правильную таблицу, как у вас, для входных данных, на основе значений, которые вы показываете для ввода
@trillion Я не уверен, что понимаю тебя. Как я могу предоставить таблицу, если я не знаю ответа.
@アルサ решение работает?
@アルサ Ваша проблема решена?
@trillion Мне нужно 10 лучших повторяющихся мест, код дал мне места меньше и больше 5 раз, но не самые повторяющиеся места.
Я считаю, что ваш вопрос не ясен и результат не ясен, вы можете задать еще один отдельный вопрос и добавить код, текущую таблицу и ожидаемые результаты.
Шаги:
with main as (
select
category_name,
sum(coalesce(times_of_going_out,0)) as total_time_per_category
from table1 as t1
left join table2 as t2
on t1.id = t2.id
group by 1
),
category as (
select
*,
if (total_time_per_category >= 5, 'more than 5', 'less than equal to 5') as is_more_than_5_times
from main
),
ranking_ as (
select *,
case when
is_more_than_5_times = 'more than 5' then
dense_rank() over (partition by is_more_than_5_times order by total_time_per_category desc)
else NULL
end AS rank_more_than_5,
case when
is_more_than_5_times = 'less than equal to 5' then
dense_rank() over (partition by is_more_than_5_times order by total_time_per_category)
else NULL
end AS rank_less_than_equal_5
from category
)
select
is_more_than_5_times,
string_agg(category_name,',') as list
from ranking_
where rank_less_than_equal_5 <=10 or rank_more_than_5 <= 10
group by 1
В заголовке написано «MySQL», но вы отметили вопрос «google-bigquery», какой из них вы используете?