Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在指定范围内循环_Sql_Postgresql - Fatal编程技术网

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一起工作,如果您不小心的话,可能会导致奇怪的时区问题:谢谢。没有遇到此问题,但是添加了时间戳。