SQL-запрос для таблицы с тремя датами и попытка стандартизировать год

#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;
  

Обратите внимание, что это гарантирует, что все годы будут включены в результирующий набор, даже если в некоторых годах отсутствуют «подписанные» или «принудительные» записи.