#mysql #sql
Вопрос:
У меня есть 2 таблицы в MySQL:
Таблица А
ID |
---|
1 |
2 |
3 |
… |
100 |
Таблица В
ID | логический | table_a_id |
---|---|---|
1 | 0 | 1 |
2 | 1 | 1 |
3 | 1 | 1 |
… | … | … |
5300 | 1 | 100 |
Стол.A имеет много таблиц.B.
Поэтому я хочу ВЫБРАТЬ 3 строки из таблицы.A с дополнительным полем, в котором вычисляется количество всех связанных строк B, но ВЫБЕРИТЕ из A только те, которые содержат 100 или более строк в B (ПОРЯДОК по ОГРАНИЧЕНИЮ 3 для total_b_rows), а также все связанные строки в B должны иметь не менее 85% истинного значения в логическом столбце. И количество соединенных строк B должно быть 5.
Результат
ID | total_b_rows | table_b.id | table_b.логическое значение |
---|---|---|---|
1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 |
… | … | … | … |
3 | 1 | 100 | 1 |
Всего строк: 15
Помогите, пожалуйста!
Ответ №1:
Вы можете использовать функции окна для вычисления пороговых значений, а затем упорядочить и ограничить до 15 строк (это гарантирует, что в таблице a будет ровно 3 идентификатора).:
select b.*
from (select b.*,
count(*) over (partition by table_a_id) as cnt,
avg(boolean) over (partition by table_a_id) as ratio,
row_number() over (partition by table_a_id order by table_a_id) as seqnum
from b
) b
where cnt > 100 and ratio > 0.85 and seqnum <= 5
order by table_a_id
limit 15
Комментарии:
1. Спасибо тебе, парень! Собираемся узнать больше о вложенных запросах и оконных функциях