#python #sql #sqlite #count
#python #sql #sqlite #количество
Вопрос:
Я пытаюсь манипулировать своими данными в SQLite и все еще новичок в этом.
Вот как выглядят мои данные:
В конечном итоге я хочу вернуть таблицу с такой структурой
YEAR NET_NEW
1994 0
1995 1
1996 0
1997 2
etc
В конечном счете, я хочу сгруппировать по годам. Net_New будет равно количеству экземпляров year_enforced, которые были сгруппированы по годам, минус количество экземпляров, в которых произошел year_terminated.
Пример логики
year = 2008
net_new = # of times 2008 occured in the column "year_enforced" - # of times 2008 occured in "year terminated"
Любая помощь приветствуется!
Комментарии:
1.
year_signed
Содержит ли столбец все годы, которые вы хотите получить в результатах?2. @forpas Я так считаю.
Ответ №1:
Используйте 2 взаимосвязанных подзапроса:
select t.year,
(select count(*) from tablename where year_enforced = t.year) -
(select count(*) from tablename where year_terminated = t.year) as net_new
from (select distinct year_signed as year from tablename) as t
order by t.year
Ответ №2:
Я не уверен, что полностью понимаю вопрос, но если бы я это сделал, я думаю, что нашел ответ. Я использовал эти данные
status,year_signed,year_enforced,year_terminated,country_1,country_b
signed,2008,0,0,barbados,ghana
active,2004,2005,0,barbados,mauritius
active,1998,1999,0,barbados,china
active,1996,1997,0,barbados,temp
active,1996,1998,0,barbados,temp
active,1995,1997,0,barbados,temp
active,1995,1995,0,barbados,temp
active,1994,2002,0,barbados,temp
И запрос, который я создал, был таким:
SELECT
year_signed - year_terminated as year,
COUNT(year_enforced) as net_new
FROM table_name
GROUP by year_enforced
Ответ №3:
Я бы отключил и агрегировал:
select year, sum(inc)
from (select year_signed as year, 1 as inc from t
union all
select year_enforced, -1 from t
) y
group by year;
Обратите внимание, что это гарантирует, что все годы будут включены в результирующий набор, даже если в некоторых годах отсутствуют «подписанные» или «принудительные» записи.