Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQL cvičení: podobnost lokálních a celostátních výsledků #225

Open
kokes opened this issue Sep 26, 2022 · 2 comments
Open

SQL cvičení: podobnost lokálních a celostátních výsledků #225

kokes opened this issue Sep 26, 2022 · 2 comments

Comments

@kokes
Copy link
Owner

kokes commented Sep 26, 2022

with okresni as (
	SELECT
		okres, psp_nuts.nazev,
		sum(poc_hlasu) hlasu_okres
	FROM
		volby.psp_okrsky_hlasy
		inner join volby.psp_nuts using(datum)
	WHERE
		datum = '2021-10-08' and psp_nuts.num_nuts = okres
	GROUP BY
		1, 2
), republika as (
	SELECT
		kstrana,
		sum(poc_hlasu) hlasu_celkem
	FROM
		volby.psp_okrsky_hlasy
	WHERE
		datum = '2021-10-08'
	GROUP BY
		1
), pomery as (
	SELECT
		okres, nazev,
		kstrana,
		sum(poc_hlasu) hlasu,
		max(okresni.hlasu_okres) hlasu_okres,
		max(republika.hlasu_celkem) as hlasu_celkem,
		max(psp_strany.zkratkak30) as strana,
		round(100*max(republika.hlasu_celkem)::numeric/(select sum(poc_hlasu) from volby.psp_okrsky_hlasy where datum='2017-10-20'), 2) as pomer_cr,
		round(100*sum(poc_hlasu)::numeric / max(okresni.hlasu_okres), 2) as pomer_okres
	FROM
		volby.psp_okrsky_hlasy hl
		join okresni using(okres)
		join volby.psp_strany using(kstrana)
		join republika using(kstrana)
	WHERE
		hl.datum = '2021-10-08' and psp_strany.datum = '2021-10-08'
	GROUP BY
		1,
		2, 3
)

-- select * from pomery

select okres, nazev, sum(pow(pomer_cr-pomer_okres, 2)) from pomery group by 1, 2
order by 3 asc

napric vsema volbama

with okresni as (
	SELECT
		datum, okres, psp_nuts.nazev,
		sum(poc_hlasu) hlasu_okres
	FROM
		volby.psp_okrsky_hlasy
		inner join volby.psp_nuts using(datum)
	WHERE psp_nuts.num_nuts = okres
	GROUP BY
		1, 2, 3
), republika as (
	SELECT
		datum, kstrana,
		sum(poc_hlasu) hlasu_celkem
	FROM
		volby.psp_okrsky_hlasy
	GROUP BY
		1, 2
), pomery as (
	SELECT
		datum, okres, nazev,
		kstrana,
		sum(poc_hlasu) hlasu,
		max(okresni.hlasu_okres) hlasu_okres,
		max(republika.hlasu_celkem) as hlasu_celkem,
		max(psp_strany.zkratkak30) as strana,
		round(100*max(republika.hlasu_celkem)::numeric/(select sum(poc_hlasu) from volby.psp_okrsky_hlasy where datum='2017-10-20'), 2) as pomer_cr,
		round(100*sum(poc_hlasu)::numeric / max(okresni.hlasu_okres), 2) as pomer_okres
	FROM
		volby.psp_okrsky_hlasy hl
		join okresni using(okres, datum)
		join volby.psp_strany using(kstrana, datum)
		join republika using(kstrana, datum)
	GROUP BY
		1,
		2, 3, 4
)

-- select * from pomery

select datum, okres, nazev, sum(pow(pomer_cr-pomer_okres, 2))::numeric(10,2) RSS from pomery group by 1, 2, 3
order by 4 desc
@kokes
Copy link
Owner Author

kokes commented Jan 17, 2023

A pro prezidentské volby (první kolo, po obcích)

with hlasy_okrsky as (
	SELECT
		datum, okres, obec, okrsek,
		generate_series(1, array_length(hlasy, 1)) ckand,
		unnest(hlasy) hlasu_kand,
		pl_hl_celk as hlasu_okrsek
	FROM
		volby.prezident_okrsky
	WHERE kolo = 1 -- prvni kolo
), hlasy_obce as (
	SELECT
		datum, okres, obec, ckand,
		sum(hlasu_kand) hlasu_kand,
		sum(hlasu_okrsek) hlasu_obec
	FROM hlasy_okrsky
	GROUP BY 1, 2, 3, 4
), republika as (
	SELECT
		datum, ckand,
		sum(hlasy_k1) hlasu_k1,
		sum(hlasy_k2) hlasu_k2,
		sum(hlc.hlasy_vsichni_k1) hlasy_vsichni_k1,
		sum(hlc.hlasy_vsichni_k2) hlasy_vsichni_k2		
	FROM
		volby.prezident_kandidati
		INNER JOIN (select datum, sum(hlasy_k1) hlasy_vsichni_k1, sum(hlasy_k2) hlasy_vsichni_k2 from volby.prezident_kandidati group by 1) hlc USING(datum)
	GROUP BY
		1, 2
), dohromady as (
	SELECT *
	FROM hlasy_obce
	INNER JOIN republika USING(datum, ckand)
	LEFT JOIN volby.prezident_obce USING(datum, okres, obec)
	WHERE datum = '2023-01-13' -- datum
)

SELECT
datum, okres, obec, nazevobce as nazev_obce,
max(hlasu_obec) hlasu_obec,
sum(pow(hlasu_kand::numeric/hlasu_obec - hlasu_k1::numeric/hlasy_vsichni_k1, 2))::numeric(10, 8) rss
FROM dohromady
GROUP BY 1, 2, 3, 4
ORDER BY 6 asc
LIMIT 10000

případně napříč všema volbama (pro porovnání vývoje obce)

with hlasy_okrsky as (
	SELECT
		datum, okres, obec, okrsek,
		generate_series(1, array_length(hlasy, 1)) ckand,
		unnest(hlasy) hlasu_kand,
		pl_hl_celk as hlasu_okrsek
	FROM
		volby.prezident_okrsky
	WHERE kolo = 1 -- prvni kolo
), hlasy_obce as (
	SELECT
		datum, okres, obec, ckand,
		sum(hlasu_kand) hlasu_kand,
		sum(hlasu_okrsek) hlasu_obec
	FROM hlasy_okrsky
	GROUP BY 1, 2, 3, 4
), republika as (
	SELECT
		datum, ckand,
		sum(hlasy_k1) hlasu_k1,
		sum(hlasy_k2) hlasu_k2,
		sum(hlc.hlasy_vsichni_k1) hlasy_vsichni_k1,
		sum(hlc.hlasy_vsichni_k2) hlasy_vsichni_k2		
	FROM
		volby.prezident_kandidati
		INNER JOIN (select datum, sum(hlasy_k1) hlasy_vsichni_k1, sum(hlasy_k2) hlasy_vsichni_k2 from volby.prezident_kandidati group by 1) hlc USING(datum)
	GROUP BY
		1, 2
), dohromady as (
	SELECT *
	FROM hlasy_obce
	INNER JOIN republika USING(datum, ckand)
	LEFT JOIN volby.prezident_obce USING(datum, okres, obec)
), rss as (
	SELECT
	datum, okres, obec, nazevobce as nazev_obce,
	max(hlasu_obec) hlasu_obec,
	sum(pow(hlasu_kand::numeric/hlasu_obec - hlasu_k1::numeric/hlasy_vsichni_k1, 2))::numeric(10, 8) rss
	FROM dohromady
	GROUP BY 1, 2, 3, 4
)

select
*,
row_number() over(partition by datum order by rss asc) poradi
from rss

tenhle druhej dotaz je pekelně pomalej (asi kvůli tomu row_number nad vším)

@kokes
Copy link
Owner Author

kokes commented Jan 17, 2023

a ještě prezidentský po okresech

with hlasy_okrsky as (
	SELECT
		datum, okres, obec, okrsek,
		generate_series(1, array_length(hlasy, 1)) ckand,
		unnest(hlasy) hlasu_kand,
		pl_hl_celk as hlasu_okrsek
	FROM
		volby.prezident_okrsky
	WHERE kolo = 1 -- prvni kolo
), hlasy_obce as (
	SELECT
		datum, okres, obec, ckand,
		sum(hlasu_kand) hlasu_kand,
		sum(hlasu_okrsek) hlasu_obec
	FROM hlasy_okrsky
	GROUP BY 1, 2, 3, 4
), hlasy_okresy as (
	SELECT
		datum, okres, ckand,
		sum(hlasu_kand) hlasu_kand,
		sum(hlasu_okrsek) hlasu_okres
	FROM hlasy_okrsky
	GROUP BY 1, 2, 3
), republika as (
	SELECT
		datum, ckand,
		sum(hlasy_k1) hlasu_k1,
		sum(hlasy_k2) hlasu_k2,
		sum(hlc.hlasy_vsichni_k1) hlasy_vsichni_k1,
		sum(hlc.hlasy_vsichni_k2) hlasy_vsichni_k2		
	FROM
		volby.prezident_kandidati
		INNER JOIN (select datum, sum(hlasy_k1) hlasy_vsichni_k1, sum(hlasy_k2) hlasy_vsichni_k2 from volby.prezident_kandidati group by 1) hlc USING(datum)
	GROUP BY
		1, 2
), dohromady as (
	SELECT republika.*, hlasy_okresy.okres, hlasy_okresy.ckand, hlasy_okresy.hlasu_kand, hlasy_okresy.hlasu_okres, nuts.nazev
	FROM hlasy_okresy
	INNER JOIN republika USING(datum, ckand)
	INNER JOIN volby.prezident_nuts nuts on nuts.datum = hlasy_okresy.datum and nuts.num_nuts = hlasy_okresy.okres
), rss as (
	SELECT
	datum, okres, nazev,
	max(hlasu_okres) hlasu_okres,
	sum(pow(hlasu_kand::numeric/hlasu_okres - hlasu_k1::numeric/hlasy_vsichni_k1, 2))::numeric(10, 8) rss
	FROM dohromady
	GROUP BY 1, 2, 3
	ORDER BY 5 asc
)

select
*,
row_number() over(partition by datum order by rss asc) poradi
from rss

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant