、表nba记录了nba(team  VARCHAR2(10),y NUMBER(4))夺冠球队的名称及年份:
TEAM                 Y
-------------------- ------------------------------
活塞                 1990
公牛                 1991
公牛                 1992
公牛                 1993
火箭                 1994
火箭                 1995
公牛                 1996
公牛                 1997
公牛                 1998
马刺              1999
湖人                 2000
湖人                 2001
湖人                 2002
马刺                2003
活塞                 2004
马刺               2005
热火                 2006
马刺               2007
凯尔特人             2008
湖人                 2009
湖人                 2010请写出一条SQL语句,查询出在此期间连续获得冠军的有哪些,其连续的年份的起止时间是多少,结果如下:TEAM               B          E
-------------------- ---------- --------------------------------
公牛                 1991       1993
火箭                 1994       1995
公牛                 1996       1998

解决方案 »

  1.   

    lag + row_number 判断差值如果等于1,则为连续的,否则为不连续的
      

  2.   

    SELECT team,
      B,
      E
    FROM
      (SELECT team,
        rk,
        MIN(y) b,
        MAX(y) e
      FROM
        (SELECT team,
          y,
          y - row_number() over(partition BY team order by y ASC) rk
        FROM nba
        )
      GROUP BY team,
        rk
      HAVING COUNT(1)>1
      )
      

  3.   

    利用排序方式的差值 来计算是否连续 
    with t1 as
    (
         select '活塞' TEAM,1990 Y from dual union all
         select '公牛' TEAM,1991 Y from dual union all
         select '公牛' TEAM,1992 Y from dual union all
         select '公牛' TEAM,1993 Y from dual union all
         select '火箭' TEAM,1994 Y from dual union all
         select '火箭' TEAM,1995 Y from dual union all
         select '公牛' TEAM,1996 Y from dual union all
         select '公牛' TEAM,1997 Y from dual union all
         select '公牛' TEAM,1998 Y from dual union all
         select '马刺' TEAM,1999 Y from dual union all
         select '湖人' TEAM,2000 Y from dual 
    )
    select TEAM,min(y) b,max(y) e
    from 
      (
      select TEAM,Y,
              row_number() over (order by Y) - row_number() over (partition by TEAM order by Y) x from t1 
       ) 
    group by TEAM,x
    having count(*) > 1     TEAM    B     E
    -----------------------------------
    1 公牛 1991 1993
    2 公牛 1996 1998
    3 火箭 1994 1995
      

  4.   

    3楼的这个顺差方法学习了。
    能不能再把这个再扩展下,假设非NBA的,年份可能不是连续的,中间有断的,又要得到连续年份的结果集。
    你这种方法如何改写?
      

  5.   

    您的思路是怎么样的
    这边的核心思路就是判断年份是否连续,且等差为1
    假设这里有数字 A,B,C,需要判断是否是连续的
    可先将三个数字排序,假设这里从小到大顺序即为
    序号  数字
    1     A
    2     B
    3     C
    如果这三个数字是连续的则,A-1,B-2,C-3则必定是相等的。
    如数字 2,3,4但是如果是2,4,6,尽管是一组等差数列,但是与序号相减的值却是不等的。同样你也可以从大到小进行排序,然后 序号+数字

    序号  数字  
    1     5
    2     4
    3     3
      

  6.   

    SELECT TEAM,  MIN(Y) B, MAX(Y) E
              FROM (SELECT TEAM,
                           Y,
                           Y - RANK() OVER(PARTITION BY TEAM ORDER BY Y ASC) RK
                      FROM NBA)
             GROUP BY TEAM, RK
            HAVING COUNT(rk) > 1