下表記錄了奪冠球隊的名稱及年份:
請寫出一條 sql 語句,查詢出在此期間連續獲得冠軍的有哪些,其連續的年份的起止時間是多少?
查詢結果:
之前我們有講解如何求解連續多少天的問題,這個題有點類似,但是也有點不一樣的地方。
問題分析一般連續性的問題,我們都需要使用笛卡爾積進行錯位匹配,就是類似a.id=b.id+1的這種。這一題我們也可以使用類似的方法。
具體**如下:
create解答的結果如下:table tmp ( id int, team varchar ( 20 ), y int
);insert
tmp ( id, team, y )
values
( 1, '
活塞', 1990
), (
2, '
公牛', 1991
), (
3, '
公牛', 1992
), (
4, '
公牛', 1993
), (
5, '
火箭', 1994
), (
6, '
火箭', 1995
), (
7, '
公牛', 1996
), (
8, '
公牛', 1997
), (
9, '
公牛', 1998
), (
10, '
馬刺', 1999
), (
11, '
湖人', 2000
), (
12, '
湖人', 2001
), (
13, '
湖人', 2002
), (
14, '
馬刺', 2003
), (
15, '
活塞', 2004
), (
16, '
馬刺', 2005
), (
17, '
熱火', 2006
), (
18, '
馬刺', 2007
), (
19, '
凱爾特人
', 2008
), (
20, '
湖人', 2009
), (
21, '
湖人', 2010
);create
table tmpx like
tmp;
set@cnt=0
;insert
into
tmpx (
select
( @cnt :=
@cnt
+1 ) as
id, a.team,
a.y
from
( select team, y from tmp group
byteam, y ) a
);--分組排序建立表
select
a.team,
min( a.y ) b,
max( a.y ) e
from
tmpx a
where
exists
(
select
1from
tmpx
where
team
=a.team
and ( y = a.y -
1or a.y = y -1)
) group
bya.team,
y - id ;
drop
table
tmp,tmpx;
我們對上面的解法進行解讀一下:首先是給這些資料新增一列自增長的id列並插入到新的臨時表#a並且對team和y排序。其次是將#a進行自匹配,匹配的條件是team名稱相同(team=a.team),並且年份y與前後的年份進行匹配(y=a.y-1 or a.y=y-1)。這個匹配是精妙地方之一,這樣就可以判定該球隊前後幾年的年份是否連續的。如果球隊名相同的前提下,年份連續,就滿足這個條件;如果年份連續,但是球隊名不相同,就不滿足這個條件了。最後在進行分組的時候,不僅對球隊team進行了分組,而且還對y-id進行了分組。為什麼要對y-id進行分組呢?如果去掉這個條件,我們發現如下情形:
公牛和湖人中間間隔了幾年才重新連續奪冠,但是這裡因為沒有對y-id進行分組,導致這個球隊和奪冠年份在進行匹配時都滿足了。因為#a表中的內容實際上是這樣的,
y=a.y-1 or a.y=y-1只要有乙個滿足即可判斷是連續的年份,實際上經過我們處理後確實滿足上述條件,所以需要加上y-id進行第二次分組來判斷中間是否有間隔的年份。因為如果有間隔,那麼y-id就不是同乙個值了。
天數最少的年份 簡易計算年份與年份之間的天數
原始碼類 package day2.homework1 public class mycalendar mydate date1 mydate date2 public mycalendar mydate date1,mydate date2 super this.date1 date1 this....
輸入年份和天數計算該年份中具體的日期(指標實現)
includevoid getdata int ptryear,int ptryeaday void getmonthday int year,int yearday,int ptrmonth,int ptrday void dispdate int year,int month,int day i...
根據資料庫中的出生年份計算年齡
在實際運用中我們會遇到在資料庫中加入使用者出生年份,而介面想要顯示年齡的需求。針對這個需求可以有多種實現方式,其中乙個是在資料庫查詢語句中計算,如下 select distinct u.cast date format now y as unsigned integer u.birth year a...