SELECT id_bioguide, MIN(term_start) AS first_term
FROM legislators_terms
WHERE term_type = 'rep'
GROUP BY 1;
SELECT
DATE_PART('century', first_term) AS cohort_century,
COUNT(id_bioguide) AS reps
FROM (
SELECT id_bioguide, MIN(term_start) AS first_term
FROM legislators_terms
WHERE term_type = 'rep'
GROUP BY 1
) AS A -- rep인 경우의 first_term
GROUP BY 1
ORDER BY 1;
SELECT
DATE_PART('century', A.first_term) AS cohort_century,
COUNT(DISTINCT A.id_bioguide) AS rep_and_sen
FROM (
SELECT id_bioguide, MIN(term_start) AS first_term
FROM legislators_terms
WHERE term_type = 'rep'
GROUP BY 1
) AS A -- rep인 경우의 first_term
JOIN legislators_terms AS B ON A.id_bioguide = B.id_bioguide
AND B.term_type = 'sen' AND B.term_start > A.first_term
GROUP BY 1;
SELECT
A2.cohort_century,
A2.reps,
B2.rep_and_sen,
ROUND(B2.rep_and_sen * 1.0 / A2.reps, 3) AS pct_rep_and_sen
FROM (
SELECT
DATE_PART('century', first_term) AS cohort_century,
COUNT(id_bioguide) AS reps
FROM (
SELECT id_bioguide, MIN(term_start) AS first_term
FROM legislators_terms
WHERE term_type = 'rep'
GROUP BY 1
) AS A -- rep인 경우의 first_term
GROUP BY 1
) AS A2
LEFT JOIN (
SELECT
DATE_PART('century', A.first_term) AS cohort_century,
COUNT(DISTINCT A.id_bioguide) AS rep_and_sen
FROM (
SELECT id_bioguide, MIN(term_start) AS first_term
FROM legislators_terms
WHERE term_type = 'rep'
GROUP BY 1
) AS A -- rep인 경우의 first_term
JOIN legislators_terms AS B ON A.id_bioguide = B.id_bioguide
AND B.term_type = 'sen' AND B.term_start > A.first_term
GROUP BY 1
) AS B2 ON A2.cohort_century = B2.cohort_century; -- rep & sen
[A2 테이블]
[B2 테이블]
SELECT
A2.cohort_century,
A2.reps,
B2.rep_and_sen,
ROUND(B2.rep_and_sen * 1.0 / A2.reps, 4) AS pct_rep_and_sen
FROM (
SELECT
DATE_PART('century', A1.first_term) AS cohort_century,
COUNT(id_bioguide) AS reps
FROM (
SELECT id_bioguide, MIN(term_start) AS first_term
FROM legislators_terms
WHERE term_type = 'rep'
GROUP BY 1
) AS A1 -- id별 rep인 경우의 first_term
WHERE first_term <= '2009-12-31'
GROUP BY 1
) AS A2 -- century별 rep인 사람의 수
LEFT JOIN (
SELECT
DATE_PART('century', B1.first_term) AS cohort_century,
COUNT(DISTINCT B1.id_bioguide) AS rep_and_sen
FROM (
SELECT id_bioguide, MIN(term_start) AS first_term
FROM legislators_terms
WHERE term_type = 'rep'
GROUP BY 1
) AS B1 -- id별 rep인 경우의 first_term
JOIN legislators_terms AS C ON B1.id_bioguide = C.id_bioguide
AND C.term_type = 'sen' AND C.term_start > B1.first_term
WHERE AGE(C.term_start, B1.first_term) <= INTERVAL '10 years'
GROUP BY 1
) AS B2 ON A2.cohort_century = B2.cohort_century;
SELECT
A2.cohort_century,
ROUND(B2.rep_and_sen_5_yrs * 1.0 / A2.reps, 4) AS pct_5_yrs,
ROUND(B2.rep_and_sen_10_yrs * 1.0 / A2.reps, 4) AS pct_10_yrs,
ROUND(B2.rep_and_sen_15_yrs * 1.0 / A2.reps, 4) AS pct_15_yrs
FROM (
SELECT
DATE_PART('century', A1.first_term) AS cohort_century,
COUNT(id_bioguide) AS reps
FROM (
SELECT id_bioguide, MIN(term_start) AS first_term
FROM legislators_terms
WHERE term_type = 'rep'
GROUP BY 1
) AS A1 -- id별 rep인 경우의 first_term
WHERE first_term <= '2009-12-31'
GROUP BY 1
) AS A2 -- century별 rep인 사람의 수
LEFT JOIN (
SELECT
DATE_PART('century', B1.first_term) AS cohort_century,
COUNT(DISTINCT CASE WHEN AGE(C.term_start, B1.first_term) <= INTERVAL '5 years'
THEN B1.id_bioguide END) AS rep_and_sen_5_yrs,
COUNT(DISTINCT CASE WHEN AGE(C.term_start, B1.first_term) <= INTERVAL '10 years'
THEN B1.id_bioguide END) AS rep_and_sen_10_yrs,
COUNT(DISTINCT CASE WHEN AGE(C.term_start, B1.first_term) <= INTERVAL '15 years'
THEN B1.id_bioguide END) AS rep_and_sen_15_yrs
FROM (
SELECT id_bioguide, MIN(term_start) AS first_term
FROM legislators_terms
WHERE term_type = 'rep'
GROUP BY 1
) AS B1 -- id별 rep인 경우의 first_term
JOIN legislators_terms AS C ON B1.id_bioguide = C.id_bioguide
AND C.term_type = 'sen' AND C.term_start > B1.first_term
GROUP BY 1
) AS B2 ON A2.cohort_century = B2.cohort_century;