У меня есть база данных с выбросами и населением.Я использую следующий запрос для получения выбросов на душу населения и рейтинга для каждой страны:
SELECT
cp.year as year,
emissions,
ci.id as countryid,
country_name,
country_iso_code,
emissions / population as per_capita,
CASE WHEN emissions / population IS NULL THEN NULL ELSE RANK() OVER (ORDER
BY CASE WHEN emissions / population IS NULL THEN 1 ELSE 0 END, emissions /
population DESC) END AS rank
FROM country_emissions ce
RIGHT JOIN
country_info ci ON (ci.countryid = ce.countryid)
RIGHT JOIN
country_population cp ON (ce.countryid = cp.countryid) AND (cp.year = ce.year)
WHERE
cp.year = 2010
GROUP BY
ce.countryid, ce.year, ce.emissions, ci.id, ci.countryid, ci.country_iso_code, ci.country_name, cp.id, cp.countryid, cp.year, cp.population
ORDER BY
emissions / population;
И он даст мне следующие результаты:
year | emissions | countryid | country_name | country_iso_code | per_capita | rank
------+-------------+-----------+--------------------------------+------------------+----------------------------+------
2010 | 212.686 | 14 | Burundi | BDI | 0.000024260031732887110996 | 201
2010 | 2020.517 | 40 | Congo, Dem. Rep. | COD | 0.000031314550846568314439 | 200
2010 | 517.047 | 187 | Chad | TCD | 0.000043496106148444352170 | 199
2010 | 612.389 | 174 | Somalia | SOM | 0.000050807074589095381376 | 198
2010 | 590.387 | 165 | Rwanda | RWA | 0.000057616483205264607379 | 197
2010 | 264.024 | 32 | Central African Republic | CAF | 0.000059350908447181931090 | 196
и т. Д.
Теперь к вопросу.Есть ли способ получить rank
и per_capita
для каждого года и каждой страны, если мы опускаем WHERE cp.year = 2010
из запроса?
Таким образом, результат будет примерно таким:
year | emissions | countryid | country_name | country_iso_code | per_capita | rank
------+-------------+-----------+--------------------------------+------------------+----------------------------+------
2010 | 212.686 | 14 | Burundi | BDI | 0.000024260031732887110996 | 201
2009 | 210.686 | 14 | Burundi | BDI | 0.000024260031732887110996 | 200
2010 | 2020.517 | 40 | Congo, Dem. Rep. | COD | 0.000031314550846568314439 | 200
2011 | 2020.517 | 40 | Congo, Dem. Rep. | COD | 0.000031314550846568314439 | 201
и т. Д.
Таким образом, в основном, запрашивайте все из таблиц и получайте рейтинг для каждой страны.Я понял, что partition by
может быть здесь полезным, но я не знаю, где он будет соответствовать в приведенном выше запросе, поскольку замена ORDER BY на него дает забавные результаты.
Это для создания APIкоторый показывает каждые годы данные о выбросах для конкретной страны, и где они ранжируются в per_capita за указанный год.