Улучшение запроса SQL для covid-project - PullRequest
0 голосов
/ 07 мая 2020

Мне было интересно, может ли кто-нибудь из вас помочь мне улучшить этот запрос

SELECT IF(cases.country_region LIKE '%Korea%', 'South Korea', IF(upper(cases.country_region) = 'IRAN (ISLAMIC REPUBLIC OF)', 'Iran',  
        IF(upper(cases.country_region) = 'REPUBLIC OF IRELAND', 'IRELAND', 
        IF(cases.country_region = 'United Kingdom', 'UK', IF(upper(cases.country_region) = 'REPUBLIC OF MOLDOVA', 'MOLDOVA', cases.country_region))))) as country, (SUM(cases.latitude)/COUNT(cases.latitude)) as latitude, 
        (SUM(cases.longitude)/COUNT(cases.longitude)) as longitude, SUM(case when cases.confirmed is null then 0 else cases.confirmed end) as total_confirmed, 
        SUM(case when cases.deaths is null then 0 else cases.deaths end) as total_deaths, SUM(case when cases.recovered is null then 0 else cases.recovered end) as total_recovered, 
        SUM(case when cases.active is null then 0 else cases.active end) as total_active_cases, MAX(cases.date) as last_update
        FROM
        `bigquery-public-data.covid19_jhu_csse.summary` cases
        INNER JOIN (
            SELECT c.country_region, MAX(c.date) as maxdate
            FROM    `bigquery-public-data.covid19_jhu_csse.summary` c
            WHERE c.date <= '2020-05-07'
            GROUP BY c.country_region
        ) lcases ON cases.country_region = lcases.country_region AND cases.date = lcases.maxdate
        GROUP BY country
        HAVING total_confirmed > 0
        ORDER BY total_confirmed desc;

Я действительно не знаю, есть ли способ упростить первую часть IF (case).

Если у кого-то есть идеи, прокомментируйте ниже! Спасибо большое!

Ответы [ 4 ]

0 голосов
/ 08 мая 2020

Вы можете упростить

case when cases.active is null then 0 else cases.active end

до

COALESCE(cases.active, 0)
0 голосов
/ 07 мая 2020

Если вам нужен упрощенный набор имен, поместите их в отдельную таблицу и left join в них. Я вижу, что ваш список растет.

Используйте COALESE(simple.name, cases.country_region), чтобы вернуться к country_region, если нет простого имени.

0 голосов
/ 08 мая 2020

Иногда лучше сделать дополнительный проход для очистки данных. Else GI GO - Garbage In, Garbage Out.

В аналогичном списке я обнаружил все эти проблемы:

Mainland China VS China
occupied Palestinian territory VS Palestine
Iran (Islamic Republic of) VS Iran
Republic of Korea VS South Korea
Korea, South VS South Korea
Congo (Kinshasa) VS Congo
Congo (Brazzaville) VS Republic of the Congo
Bahamas, The VS The Bahamas
Hong Kong SAR VS Hong Kong
Gambia, The VS Gambia
Taiwan* VS Taiwan
 Azerbaijan VS Azerbaijan

Также проверьте окончания строк - CRLF vs LF. И спецификация.

0 голосов
/ 07 мая 2020

Вы можете использовать CASE, как показано ниже в операторе SELECT -

SELECT
CASE 
    WHEN cases.country_region LIKE '%Korea%' THEN 'South Korea'
    WHEN upper(cases.country_region) = 'IRAN (ISLAMIC REPUBLIC OF)' THEN 'Iran'
    WHEN upper(cases.country_region) = 'REPUBLIC OF IRELAND' THEN 'IRELAND'
    WHEN cases.country_region = 'United Kingdom' THEN 'UK'
    WHEN upper(cases.country_region) = 'REPUBLIC OF MOLDOVA' THEN 'MOLDOVA'
    ELSE cases.country_region
END AS country
FROM ...

Вы также можете использовать ту же строку кодов в разделе GROUP BY, если требуется.

...