как пройти через указанный диапазон - PullRequest
1 голос
/ 14 ноября 2011

У меня есть база фильмов, где одно поле - это год, когда оно было выпущено.

Я хочу создать запрос, который будет перебирать каждое десятилетие и вычислять сумму определенного поля за это десятилетие. Я понятия не имею, как я могу получить петлю для каждого десятилетия. Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Если вам нужны десятилетия, когда у вас нет ни фильмов, ни фильмов с фильмами, тогда вы можете использовать generate_series, чтобы составить список десятилетий и выполнить левое внешнее объединение для ваш стол; generate_series - это стандартный способ создания числовых и временных списков на лету в PostgreSQL. Как-то так должно начаться:

select decade.d, count(t.year)
from generate_series(1900, 2100, 10) as decade(d)
left outer join your_table t on decade.d = floor(t.year / 10) * 10
group by decade.d
order by decade.d

Это даст такой результат:

  d   | count 
------+-------
 1900 |     1
 1910 |     0
 1920 |     1
 1930 |     3
 1940 |     0
 1950 |     0
 1960 |     1
 1970 |     0
 1980 |     3
-- ...
 2100 |     0

Вы можете настроить первое и последнее значения для вызова generate_series, чтобы соответствовать вашим данным, если это необходимо.

Бит floor(t.year / 10) * 10 дает вам десятилетие для данного года; он преобразует 1942 в 1940, 2000 в 2000 и т. д.

Вы можете настроить таблицу десятилетий (таблицу из одного столбца с одной записью для каждого десятилетия), если вы переходите в базу данных, в которой нет ничего похожего на generate_series. SQL будет почти таким же, просто замените вызов generate_series на таблицу декад.

0 голосов
/ 14 ноября 2011

Попробуйте что-то вроде этого (не знаю, как выглядят ваши таблицы, угадайте):

SELECT movie_year, sum(column_x)
FROM (
    SELECT year
        , date_trunc('decade', movie_year)::date as decade
        , column_x
    FROM movies) as movies_with_decades
GROUP BY decade
ORDER BY decade;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...