自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL如何求解連續(xù)年份的問題?

數(shù)據(jù)庫
請寫出一條 SQL 語句,查詢出在此期間連續(xù)獲得冠軍的有哪些,其連續(xù)的年份的起止時(shí)間是多少?

[[414963]]

本文轉(zhuǎn)載自微信公眾號「SQL數(shù)據(jù)庫開發(fā)」,作者丶平凡世界。轉(zhuǎn)載本文請聯(lián)系SQL數(shù)據(jù)庫開發(fā)公眾號。

最近看到這樣一道題目,覺得挺有意思,給小伙伴們分享一下解題思路。

下表記錄了奪冠球隊(duì)的名稱及年份:

請寫出一條 SQL 語句,查詢出在此期間連續(xù)獲得冠軍的有哪些,其連續(xù)的年份的起止時(shí)間是多少?

查詢結(jié)果:

之前我們有講解如何求解連續(xù)多少天的問題,這個(gè)題有點(diǎn)類似,但是也有點(diǎn)不一樣的地方。

問題分析

一般連續(xù)性的問題,我們都需要使用笛卡爾積進(jìn)行錯(cuò)位匹配,就是類似a.ID=b.ID+1的這種。這一題我們也可以使用類似的方法。

具體代碼如下:

  1. CREATE TABLE  #t(TEAM varchar(20), Y int
  2. INSERT #t(TEAM,Y)  VALUES 
  3. ('活塞',1990), 
  4. ('公牛',1991), 
  5. ('公牛',1992), 
  6. ('公牛',1993), 
  7. ('火箭',1994), 
  8. ('火箭',1995), 
  9. ('公牛',1996), 
  10. ('公牛',1997), 
  11. ('公牛',1998), 
  12. ('馬刺',1999), 
  13. ('湖人',2000), 
  14. ('湖人',2001), 
  15. ('湖人',2002), 
  16. ('馬刺',2003), 
  17. ('活塞',2004), 
  18. ('馬刺',2005), 
  19. ('熱火',2006), 
  20. ('馬刺',2007), 
  21. ('凱爾特人',2008), 
  22. ('湖人',2009), 
  23. ('湖人',2010); 
  24.  
  25. SELECT RN=IDENTITY(INT),* INTO #a FROM #t ORDER BY TEAM,Y 
  26.  
  27.    SELECT a.TEAM, 
  28.    MIN(a.Y) B, 
  29.    MAX(a.Y) E 
  30.    FROM #a a 
  31.    WHERE EXISTS( 
  32.      SELECT 1 FROM #a 
  33.      WHERE TEAM=a.TEAM 
  34.      AND (Y=a.Y-1 OR a.Y=Y-1) 
  35.    ) 
  36.    GROUP BY a.TEAM,Y-RN 
  37.  
  38. DROP TABLE #t,#a 

解答的結(jié)果如下:

我們對上面的解法進(jìn)行解讀一下:

首先是給這些數(shù)據(jù)添加一列自增長的RN列并插入到新的臨時(shí)表#a并且對TEAM和Y排序。

其次是將#a進(jìn)行自匹配,匹配的條件是TEAM名稱相同(TEAM=a.TEAM),并且年份Y與前后的年份進(jìn)行匹配(Y=a.Y-1 OR a.Y=Y-1)。

這個(gè)匹配是精妙地方之一,這樣就可以判定該球隊(duì)前后幾年的年份是否連續(xù)的。

如果球隊(duì)名相同的前提下,年份連續(xù),就滿足這個(gè)條件;

如果年份連續(xù),但是球隊(duì)名不相同,就不滿足這個(gè)條件了。

最后在進(jìn)行分組的時(shí)候,不僅對球隊(duì)TEAM進(jìn)行了分組,而且還對Y-RN進(jìn)行了分組。為什么要對Y-RN進(jìn)行分組呢?

如果去掉這個(gè)條件,我們發(fā)現(xiàn)如下情形:

公牛和湖人中間間隔了幾年才重新連續(xù)奪冠,但是這里因?yàn)闆]有對Y-RN進(jìn)行分組,導(dǎo)致這個(gè)球隊(duì)和奪冠年份在進(jìn)行匹配時(shí)都滿足了。因?yàn)?a表中的內(nèi)容實(shí)際上是這樣的,

 

Y=a.Y-1 OR a.Y=Y-1只要有一個(gè)滿足即可判斷是連續(xù)的年份,實(shí)際上經(jīng)過我們處理后確實(shí)滿足上述條件,所以需要加上Y-RN進(jìn)行第二次分組來判斷中間是否有間隔的年份。因?yàn)槿绻虚g隔,那么Y-RN就不是同一個(gè)值了。

 

責(zé)任編輯:武曉燕 來源: SQL數(shù)據(jù)庫開發(fā)
相關(guān)推薦

2023-11-02 08:38:49

遞歸SQL用法

2021-04-06 11:50:30

SQL數(shù)據(jù)統(tǒng)計(jì)

2021-11-03 16:00:40

SQL流量序號

2021-01-05 08:12:42

SQL日期Spt

2010-06-11 13:05:41

openSUSE視頻

2010-06-11 09:13:20

openSUSE 網(wǎng)卡

2010-06-09 13:03:00

Opensuse分區(qū)

2010-09-26 17:14:23

SQL查詢

2010-06-11 16:33:21

openSUSE fl

2011-05-17 13:22:50

SQL對象名無效

2009-04-23 09:11:49

職場IT人求職

2018-09-20 11:54:31

數(shù)據(jù)庫MySQL性能優(yōu)化

2011-12-19 14:22:36

云計(jì)算虛擬化

2010-09-24 15:46:23

SQL查詢

2011-04-25 14:51:24

2010-08-31 08:38:55

SQL Server

2017-07-26 21:54:59

2021-11-09 06:55:03

SQLServer排序

2010-09-25 10:05:25

sql server主
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號