2012-02-03 85 views
0

我有一个包含年份和电影ID的表格,并且每年我都要获得该年度10年内ID的计数。sql选择一个移动范围

例如如果我有数据: 年| ID 1950年1 1951年2 1960年1

我希望回到 一年|算上 1950年3 1951年3 1960年1

我想我可以做这样的

select m1.year, count(m1.id) 
    from movie m1 
    join movie m2 
    on m1.id=m2.id 
where m2.year>=m1.year 
    and m2.year<=m1.year+9 
group by m1.year 
order by m1.year; 

但这只是返回的电影每年(或似乎是,因为结果是相同的选择年,从电影组开始计数(id)逐年;)

我做错了什么?

+2

侧面说明:你可以写'其中m2 .year - m1.year BETWEEN 0 AND 9' – Benoit 2012-02-03 06:30:56

回答

1

入世对IDS是不是你想要的东西:你会得到一个1 < => 1的关系最有可能(我可以假设id是一个关键

SELECT m1.year, COUNT(*) 
    FROM (SELECT DISTINCT year FROM movie) m1 
CROSS JOIN movie M2 
WHERE m2.year - m1.year BETWEEN 0 AND 9 
GROUP BY m1.year 
ORDER BY m1.year 
+0

什么是交叉连接? – Colleen 2012-02-03 06:35:03

+0

是的,id是主键 – Colleen 2012-02-03 06:35:34

+0

'CROSS JOIN'是笛卡尔积:m1的每一行你得到m2的每一行。可以用一个简单的逗号代替'CROSS JOIN' – Benoit 2012-02-03 06:36:57