2015-03-21 3 views
1

enter image description here Я использую 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?

ответ

2

Вы в основном хотите дублировать человека за каждый год, в котором они служили, и затем группировать его, чтобы вы могли рассчитывать их каждый год. Затем, чтобы перевести счеты в столбцы, вы можете суммировать условный оператор, который ищет значение, которое вы хотите подсчитать. Что-то вроде:

select 
    year, 
    sum(case when party = 'Republican' then 1 else 0 end) as republicans, 
    sum(case when party = 'Democrat' then 1 else 0 end) as democrats, 
    sum(case when party <> 'Republican' and party <> 'Democrat' then 1 else 0 end) as other 
from person_roles p 
join generate_series(1789,2015) as s(year) 
    on year between date_trunc('year', start_date) 
        and date_trunc('year', end_date) 
group by year; 
+0

Привет @EvilPuppetMaster, большое вам спасибо! Я понимаю вашу логику для этого запроса, но когда я запускаю этот SQL-скрипт в оболочке, он дает мне следующую ошибку: operator не существует: integer> = timestamp с часовым поясом. Line8: в году между date_trunc ('year', start_date) СОВЕТ: оператор не соответствует указанному имени и типу аргументов. Возможно, вам придется добавлять явные типы. Как мы можем это исправить? Благодаря! – mflowww

+0

btw Я просто добавил скриншот об исходной таблице SQL «person_roles» к описанию моей проблемы. – mflowww

+0

Исправлена ​​ошибка. Если я изменил date_trunc ('year', start_date) на date_part ('year', start_date), тогда это сработает. Благодаря! – mflowww