Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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
Python 如何在sqlite查询中将组中的年份合并为10_Python_Sql_Pandas_Sqlite_Date - Fatal编程技术网

Python 如何在sqlite查询中将组中的年份合并为10

Python 如何在sqlite查询中将组中的年份合并为10,python,sql,pandas,sqlite,date,Python,Sql,Pandas,Sqlite,Date,电影中期、名称、年份、等级 我想数一数十年内的电影数量。假设表中的年份从1931年开始 那么从1931年到1940年将形成一个十年 我的问题是: query_7 = pd.read_sql_query('''SELECT yr.year as dec_start,yr.year + 9 as dec_end,COUNT(DISTINCT m.MID) as num_movies FROM (SELECT DISTINCT year FR

电影中期、名称、年份、等级 我想数一数十年内的电影数量。假设表中的年份从1931年开始 那么从1931年到1940年将形成一个十年

我的问题是:

query_7 = pd.read_sql_query('''SELECT yr.year as dec_start,yr.year + 9 as dec_end,COUNT(DISTINCT m.MID) as num_movies
                             FROM  (SELECT DISTINCT year FROM Movie) yr ,Movie m WHERE m.year >= yr.year
                             AND m.year < yr.year + 10
                             GROUP BY yr.year 
                             ORDER BY yr.year 
                             ''',conn)
输出:

这个查询的问题是,它从每一年开始计算十年。 如果1931年是数据库中最低的一年,那么第一个十年应该从1931年开始,下一个十年应该从1941年开始,而不是从1936年开始


非常感谢您对这方面的任何见解

我认为这正是您想要的:

SELECT 
    year/10 * 10 + 1 as dec_start,
    year/10 * 10 + 10 as dec_end,
    COUNT(mid) as num_movies
FROM  Movie
GROUP BY year/10 
ORDER BY dec_start
这是通过对年份执行整数除法来实现的,然后调整以得到十年

假设年份是1934年,年份/10是193年,那么193*10+1产生1931年,而193*10+10产生1940年


我不认为你真的需要countdistinct count来做这件事。

我认为这正是你想要的:

SELECT 
    year/10 * 10 + 1 as dec_start,
    year/10 * 10 + 10 as dec_end,
    COUNT(mid) as num_movies
FROM  Movie
GROUP BY year/10 
ORDER BY dec_start
这是通过对年份执行整数除法来实现的,然后调整以得到十年

假设年份是1934年,年份/10是193年,那么193*10+1产生1931年,而193*10+10产生1940年


我不认为你真的需要countdistinct count,你应该这样做。

如果你想要从表中最小年份开始的几十年,请使用以下方法:

SELECT 
  (year - s.start_from) / 10 * 10 + s.start_from as dec_start, 
  (year - s.start_from) / 10 * 10 + s.start_from + 9 as dec_end,
  COUNT(DISTINCT MID) as num_movies
FROM  Movie CROSS JOIN (SELECT MIN(year) % 10 start_from FROM Movie) s
GROUP BY dec_start, dec_end 

请参阅。

如果您想要从表中最小年份开始的十年,请使用以下选项:

SELECT 
  (year - s.start_from) / 10 * 10 + s.start_from as dec_start, 
  (year - s.start_from) / 10 * 10 + s.start_from + 9 as dec_end,
  COUNT(DISTINCT MID) as num_movies
FROM  Movie CROSS JOIN (SELECT MIN(year) % 10 start_from FROM Movie) s
GROUP BY dec_start, dec_end 

请参阅。

能否帮助我理解为什么我的原始查询会给出每个唯一查询的结果year@LalitJain:原始查询的主要问题是它是按年份分组的,虽然您需要按十年进行分组,因此year/10year/10将给出3位数字,如果十年从1941年开始,则year/10将是194,因此在分组时,它将检查year是否有194,并基于此对所有电影进行分组。是的???@LalitJain:是的。@GBM但是这个查询只有在十年从1931年开始或者说从一个人的数字开始是1时才有效。如果一年从1935年开始,那么它将不起作用?请帮助我理解为什么我最初的查询会给出每个唯一的结果year@LalitJain:原始查询的主要问题是它是按年份分组的,虽然您需要按十年进行分组,因此year/10year/10将给出3位数字,如果十年从1941年开始,则year/10将是194,因此在分组时,它将检查year是否有194,并基于此对所有电影进行分组。是的???@LalitJain:是的。@GBM但是这个查询只有在十年从1931年开始或者说从一个人的数字开始是1时才有效。如果一年从1935年开始,那么它就不起作用了?@LalitJain我已经更正并简化了代码。@LalitJain我已经更正并简化了代码。