T SQL又另外兩種找出 年連續獲獎的人

2022-02-18 06:13:41 字數 2389 閱讀 9831

此題目要求查詢連續三年獲獎的人。首先建立乙個表,填充資料。

;with prize(name, year) as(

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)

prize表的列name表示姓名,而year表示獲獎的年份。

那麼結果表中左輸入對應行會超過三行。接下來按姓名和月份分組,找出count大於3的就可以了。如下:

select distinct name

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

2 第二種方式,使用cte遞迴進行查詢。如下:

;with cte1(name, year, count) as

( 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

這個遞迴的定位條件就是按名字分組,找出獲獎年最小的那個。接下來就是遞迴實現的部分。用prize表和cte表進行連線,連線的條件是名字相等,同時新加入行的獲獎年份比

當前大。這種方式的關鍵是在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。現在把問題交給你,你能不能也很快的找出所有和...