Я хочу найти показатели, по которым наибольшему количеству стран не хватает информации полностью, т. Е. Max (количество отсутствующих показателей по странам)
Это логическое противоречие. Счетчик пропущенных индикаторов по странам *
по странам
.. не может быть прикреплен к каким-либо указанным c индикаторам, поскольку эти страны не иметь показатель.
Подсчет по стране с «отсутствующим показателем» (т. е. indicator_id IS NULL
) :
SELECT country_id, count(*) AS ct_indicator_null
FROM education_data
WHERE indicator_id IS NULL
GROUP BY country_id
ORDER BY count(*) DESC;
Или, в более общем случае, без допустимый индикатор, который также включает строки, в которых indicator_id
не имеет соответствия в таблице indicators
:
SELECT country_id, count(*) AS ct_no_valid_indicator
FROM education_data e
WHERE NOT EXISTS (
SELECT FROM indicators i
WHERE i.id = e.indicator_id
)
GROUP BY country_id
ORDER BY count(*) DESC;
NOT EXISTS
- это одна из четырех базовых c техник, которые применяются здесь (LEFT
/ RIGHT JOIN
, как будто ты пытался быть другим). См .:
Вы упомянули таблицу country
. Страны без каких-либо показателей в education_data
не включены в приведенный выше результат. Чтобы найти их, также:
SELECT *
FROM country c
WHERE NOT EXISTS (
SELECT
FROM education_data e
JOIN indicators i ON i.id = e.indicator_id -- INNER JOIN this time!
WHERE e.country_id = c.id
);
Сообщает страны без действительного индикатора (нет или недействителен).
Если каждая страна должна иметь действительный индикатор, после очистки существующих данных, рассмотрим:
.., что приближает вас к правильной реализации многие-ко-многим . См .: