Я использую Postgres для анализа некоторых данных. У меня есть таблица SQL, называемая person_roles
в базе данных под названием Конгресс. Эта person_roles
таблица содержит следующие столбцы:Как выбрать следующие вещи из таблицы psql?
person_id (каждый идентификатор уникальный человек),
типа (сенатор или представитель),
START_DATE (дата этого человека, начиная с выступать на конгрессе, например, 1789-03-04 или, например, 2015-01-06),
end_date (дата, когда этот человек заканчивается на конгрессе, например 1791-03-03 или, например, 2021-01 -03),
состояние (которое государство США этот человек служит в его/ее срок)
партия (демократ, республиканец, и многие другие стороны; обратите внимание, что есть 4228 людей, для которых общей партии не являются ни демократы, ни республиканцы, от 1789 до 2015)
Я хочу разобрать этот SQL таблицу и получить следующий вывод. Затем я хочу экспортировать такие результаты в файл csv.
Мой требуемую таблицу вывода должен иметь следующие столбцы:
год (начиная с 1789 и заканчивая 2015: 1789, 1790, ..., 2014, 2015)
Количество (или счет) всех демократических лиц (как сенаторов, так и представителей) в течение КАЖДОГО ГОДА для всех штатов
Число (или сенаторов) от общего числа лиц республиканцев (как сенаторов, так и представителей) в течение КАЖДОГО ГОДА для всех штатов
Количество (или количество) из других партий лиц (как сенаторов и представителей) для каждого года для всех государств
Поскольку существует 227 лет с 1789 до 2015 года, моя требуемая таблица вывода должна имеют 227 строк.
Обратите внимание, что за каждый год, например, 1996 год, до тех пор, пока в этом году или до этого года (например, < = 1996-12-31), а его конечная дата - в этом году или после этого года (например,> = 1996-01-02) И его/ее start_date < = end_date, тогда этот человек будет считаться членом Конгресса, который будет работать в этом году (например, 1996).
Я знаю, как найти число демократов или республиканцев или других сторон за данный год в этой таблице.В принципе, к примеру, если я введите следующую команду в конгрессе = #
SELECT COUNT(*) AS numberdem
FROM person_roles
WHERE party = 'Democrat'
AND start_date <= '1996-12-31'
AND end_date >= '1996-01-02'
AND start_date <= end_date;
тогда я получаю результат:
numberdem
----------------
251
(1 row)
Точно так же, если я введите следующую команду:
SELECT COUNT(*) AS numberrep
FROM person_roles
WHERE party = 'Republican'
AND start_date <= '1996-12-31'
AND end_date >= '1996-01-02'
AND start_date <= end_date;
затем я получу результат:
numberrep
----------------
291
(1 row)
Если я типа:
SELECT COUNT(*) AS numberother
FROM person_roles
WHERE party <> 'Republican'
AND party <> 'Democrat'
AND start_date <= '1996-12-31'
AND end_date >= '1996-01-02'
AND start_date <= end_date;
тогда я получаю результат:
numberother
-----------------
2
(1 row)
Однако, я не знаю, как получить таблицу результатов, которая состоит из 4-х столбцов, где первый столбец дает год (каждый год с 1789 по 2015 год), во втором столбце указывается количество демократов (число) каждого конкретного года с 1789 по 2015 год, в третьем столбце указывается количество республиканцев (количество репрессий) каждого конкретного года с 1789 по 2015 год, и в четвертом столбце указывается количество других сторон (число других) каждого конкретного года с 1789 по 2015 год. В конце концов, я хочу экспортировать этот вывод SQL t способный из 227 строк (потому что есть 227 лет с 1789 по 2015 год) и 4 столбца в файл csv.
Как я могу достичь такой задачи с помощью команды SQL? Если эта задача не является долговечной с SQL, должен ли я экспортировать все данные из таблицы person_roles и экспортировать ее в Excel csv и проанализировать этот файл Excel?
Привет @EvilPuppetMaster, большое вам спасибо! Я понимаю вашу логику для этого запроса, но когда я запускаю этот SQL-скрипт в оболочке, он дает мне следующую ошибку: operator не существует: integer> = timestamp с часовым поясом. Line8: в году между date_trunc ('year', start_date) СОВЕТ: оператор не соответствует указанному имени и типу аргументов. Возможно, вам придется добавлять явные типы. Как мы можем это исправить? Благодаря! – mflowww
btw Я просто добавил скриншот об исходной таблице SQL «person_roles» к описанию моей проблемы. – mflowww
Исправлена ошибка. Если я изменил date_trunc ('year', start_date) на date_part ('year', start_date), тогда это сработает. Благодаря! – mflowww