此題目要求查詢連續三年獲獎的人。首先建立乙個表,填充資料。
;with prize(name, year) as(prize表的列name表示姓名,而year表示獲獎的年份。select 'kim', 2001 union all
select 'tim', 2002 union all
select 'tang', 2002 union all
select 'jack', 2001 union all
select 'juicy', 2001 union all
select 'peff', 2002 union all
select 'juicy', 2002 union all
select 'kim', 2002 union all
select 'juicy', 2003 union all
select 'peff', 2003 union all
select 'kim', 2003 union all
select 'tim', 2004 union all
select 'juicy', 2004 union all
select 'jack', 2005 union all
select 'eric', 2005 union all
select 'tim', 2005 union all
select 'eric', 2006 union all
select 'peff', 2006 union all
select 'juicy', 2007 union all
select 'eric', 2007 union all
select 'tang', 2007 union all
select 'tang', 2008 union all
select 'peff', 2008 union all
select 'kim', 2008 union all
select 'jack', 2009 union all
select 'tang', 2009 union all
select 'kim', 2009)
select *
into dbo.prize
from prize
order by name, year
create clustered index cluster_index_main on dbo.prize(name)
那麼結果表中左輸入對應行會超過三行。接下來按姓名和月份分組,找出count大於3的就可以了。如下:
select distinct name2 第二種方式,使用cte遞迴進行查詢。如下:from(
select name, year, count(lyear) c
from(
select *
from dbo.prize p1
select top 3 year lyear
from dbo.prize p2
where p1.name = p2.name and p2.year >= p1.year and
p2.year - p1.year <=2
order by year) as d1
) as d2
group by name, year
) as d3
where d3.c >=3
;with cte1(name, year, count) as這個遞迴的定位條件就是按名字分組,找出獲獎年最小的那個。接下來就是遞迴實現的部分。用prize表和cte表進行連線,連線的條件是名字相等,同時新加入行的獲獎年份比( select name, min(year), 1
from dbo.prize
group by name
union all
select p.name, p.year ,
case
when p.year = c.year + 1 then c.count +1
else 1
end
from dbo.prize p join cte1 c
on p.name = c.name and p.year > c.year
)select distinct name
from cte1
where count >= 3
order by name
當前大。這種方式的關鍵是在case語句,如果找到的行的year比當前行的year大1,那麼就更新count,為當前行的count+1.否則,說明當前行不是連續獲獎的year,使count
計數歸位,還原為1。最後只需要查詢count大於等於3的行。
T SQL中case語句的兩種寫法及區別
t sql中的case語句相信大家一定不陌生,但是它有2種寫法,如下 寫法一 case 變數 when 值1 then.when 值2 then.else end寫法二 case when 邏輯表示式 then true的情況 else false的情況 end如果是二叉分支,筆者建議寫法二 因為,...
java中陣列的賦值及另外兩種定義方式
一 陣列的操作,使用索引,對陣列中的元素賦值 二 陣列的兩種定義方式 1.資料型別 變數名 new 資料型別 注意事項 new後面的中括號中不允許寫任何內容,寫了就編譯失敗 2.資料型別 變數名 public class arraydemo 1 system.out.println arr2.len...
和為S的連續正數序列 兩種思路
小明很喜歡數學,有一天他在做數學作業時,要求計算出9 16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100 至少包括兩個數 沒多久,他就得到另一組連續正數和為100的序列 18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和...