Sql 如何在指定范围内循环
我有一个电影数据库,其中一个领域是电影发行的年份 我想创建一个查询,它将在每个十年中循环,并将计算该十年中特定字段的总和。我不知道怎样才能每十年得到一个循环。有人能帮忙吗 试试这样(不知道你的桌子是什么样子,猜猜看): 试试这样(不知道你的桌子是什么样子,猜猜看):Sql 如何在指定范围内循环,sql,postgresql,Sql,Postgresql,我有一个电影数据库,其中一个领域是电影发行的年份 我想创建一个查询,它将在每个十年中循环,并将计算该十年中特定字段的总和。我不知道怎样才能每十年得到一个循环。有人能帮忙吗 试试这样(不知道你的桌子是什么样子,猜猜看): 试试这样(不知道你的桌子是什么样子,猜猜看): 如果您希望在没有任何电影以及有电影的几十年中使用,那么您可以使用来构建您的几十年列表,并将左外部联接到您的表中generate_series是PostgreSQL中动态构建数字和时间列表的标准方法。像这样的事情应该让你开始: sel
如果您希望在没有任何电影以及有电影的几十年中使用,那么您可以使用来构建您的几十年列表,并将左外部联接到您的表中
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
调用的第一个和最后一个值以匹配您的数据
下限(t.year/10)*10
位给出给定年份的十年;它将把1942年变成1940年,2000年变成2000年,等等
如果您移动到一个没有类似于
generate\u series
的数据库,则可以设置一个十年表(一列表,每个十年有一个条目)。SQL也差不多,只需将generate_series
调用替换为您的Decedure表。如果您想要没有电影的十年以及有电影的十年,那么您可以使用来构建十年列表,并将左外部联接到您的表中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
调用的第一个和最后一个值以匹配您的数据
下限(t.year/10)*10
位给出给定年份的十年;它将把1942年变成1940年,2000年变成2000年,等等
如果您移动到一个没有类似于
generate\u series
的数据库,则可以设置一个十年表(一列表,每个十年有一个条目)。SQL几乎是一样的,只需将generate\u series
调用替换为您的十年表。我在postgresql中进行了类似的查询。我要检查我是否保存了它。我在postgresql中做了类似的查询。我要检查我是否保存了它。虽然在本例中这可能与此无关,但值得注意的是,generate\u series
也可以用于日期范围。@PeterM:在使用generate\u series
时需要小心,这种形式的generate_series
实际上与timestamz
s一起工作,如果您不小心的话,可能会导致奇怪的时区问题:谢谢。没有遇到此问题,但是添加了时间戳
cast。虽然在本例中这可能与此无关,但值得注意的是,generate\u series
也可以用于日期范围。@PeterM:在使用generate\u series
时需要小心,这种形式的generate_series
实际上与timestamz
s一起工作,如果您不小心的话,可能会导致奇怪的时区问题:谢谢。没有遇到此问题,但是添加了时间戳。