TEAM (varchar2)                       Y(int)
---------- ---------------------------------------
公牛                                          1992
公牛                                          1993
火箭                                          1994
火箭                                          1995
公牛                                          1996
公牛                                          1997
公牛                                          1998
马刺                                          1999
湖人                                          2000
湖人                                          2001
湖人                                          2002
马刺                                          2003
活塞                                          2004
马刺                                          2005
热火                                          2006
马刺                                          2007
凯尔特人                                      2008
湖人                                          2009
湖人                                          2010写一段sql语句,要求查出那个球队是连续两年以上夺冠的(包含2年),显示夺冠的开始和结束时间,显示效果如下:
 
TEAM         START_HM     END_HM
---------- ---------- ----------
公牛             1996       1998
火箭             1994       1995
公牛             1992       1993
湖人             2000       2002
湖人             2009       2010

解决方案 »

  1.   

    顺序自己排,SQL> WITH t AS (
      2  SELECT '公牛' team,1992 y FROM DUAL UNION ALL
      3  SELECT '公牛' team,1993 y FROM DUAL UNION ALL
      4  SELECT '火箭' team,1994 y FROM DUAL UNION ALL
      5  SELECT '火箭' team,1995 y FROM DUAL UNION ALL
      6  SELECT '公牛' team,1996 y FROM DUAL UNION ALL
      7  SELECT '公牛' team,1997 y FROM DUAL UNION ALL
      8  SELECT '公牛' team,1998 y FROM DUAL UNION ALL
      9  SELECT 'ma刺' team,1999 y FROM DUAL UNION ALL
     10  SELECT '湖人' team,2000 y FROM DUAL UNION ALL
     11  SELECT '湖人' team,2001 y FROM DUAL UNION ALL
     12  SELECT '湖人' team,2002 y FROM DUAL UNION ALL
     13  SELECT 'ma刺' team,2003 y FROM DUAL UNION ALL
     14  SELECT '活塞' team,2004 y FROM DUAL UNION ALL
     15  SELECT 'ma刺' team,2005 y FROM DUAL UNION ALL
     16  SELECT 're火' team,2006 y FROM DUAL UNION ALL
     17  SELECT 'ma刺' team,2007 y FROM DUAL UNION ALL
     18  SELECT 'kaier特人' team,2008 y FROM DUAL UNION ALL
     19  SELECT '湖人' team,2009 y FROM DUAL UNION ALL
     20  SELECT '湖人' team,2010 y FROM DUAL
     21  )
     22  SELECT t2.team,
     23         MIN(t2.y) start_hm,
     24         MAX(t2.y) end_hm
     25    FROM (SELECT t.team,
     26                 t.y,
     27                 t.y - ROW_NUMBER() OVER(PARTITION BY t.team ORDER BY t.y) y1
     28            FROM t) t2
     29   GROUP BY t2.team,
     30            t2.y1
     31  HAVING COUNT(*) > 1
     32  ;TEAM          START_HM     END_HM
    ----------- ---------- ----------
    公牛              1996       1998
    湖人              2000       2002
    火箭              1994       1995
    湖人              2009       2010
    公牛              1992       1993
      

  2.   

    未经测试 概不负责select team, LEAD(Y, 1) OVER (partition by team ORDER BY Y)    as nextY
    from T 
    where  Y - nextY = 1
      

  3.   


    with t as   是啥呀
      

  4.   

    SELECT 
    b.[TEAM],b.[Y] AS  START_HM,MIN(a.[Y]) AS END_HM
    FROM 
    (Select * from TableName AS a WHERE  NOT EXISTS(SELECT 1 FROM TableName WHERE [TEAM]=a.[TEAM] AND [Y]=a.[Y]+1)) AS a
    INNER JOIN 
    (Select * from TableName AS a WHERE  NOT EXISTS(SELECT 1 FROM TableName WHERE [TEAM]=a.[TEAM] AND [Y]=a.[Y]-1)) AS b ON a.[TEAM]=b.[TEAM] AND b.[Y] <=a.[Y] 
    GROUP BY b.[TEAM],b.[Y]
    HAVING MIN(a.[Y])-b.[Y]>=1
    ORDER BY MIN(a.[Y])-b.[Y] DESC
      

  5.   

    mysql:SELECT t2.team,
           MIN(t2.y) start_hm,
           MAX(t2.y) end_hm
      FROM (
            SELECT team,y,y - rank y1 from (
                SELECT tmp.team,
                       tmp.y,
                       IF(@groupid = tmp.team,@rank := @rank + 1,@rank := 1) AS rank,
                       @groupid := tmp.team
                  FROM (SELECT team,y FROM teamtb ORDER BY y) tmp,
                       (SELECT @rank := 0,@groupid := '') a
                ) b
            ) t2
     GROUP BY t2.team,
              t2.y1
    HAVING COUNT(*) > 1
      

  6.   

    oracle里面 hudingchen 写法是对的,mysql不懂。
      

  7.   

    TEAM (varchar2) Y(int)
    ---------- ---------------------------------------
    公牛 1992
    公牛 1993
    火箭 1994
    火箭 1995
    公牛 1996
    公牛 1997
    公牛 1998
    马刺 1999
    湖人 2000
    湖人 2001
    湖人 2002
    马刺 2003
    活塞 2004
    马刺 2005
    热火 2006
    马刺 2007
    凯尔特人 2008
    湖人 2009
    湖人 2010写一段sql语句,要求查出那个球队是连续两年以上夺冠的(包含2年),显示夺冠的开始和结束时间,显示效果如下:
     
    TEAM START_HM END_HM
    ---------- ---------- ----------
    公牛 1996 1998
    火箭 1994 1995
    公牛 1992 1993
    湖人 2000 2002
    湖人 2009 2010 
    湖人不是有5次吗???
      

  8.   

    没有测试:
    select TEAM,sum(TEAM) number,max(Y) START_HM,min(Y)END_HM
    from table_name
    where number>=2 and START_HM-END_HM<=number
    group by TEAM
      

  9.   

    大哥,你哪个眼看到湖人不是5次了啊?
    TEAM START_HM END_HM
    湖人  2000    2002
    湖人  2009    2010
    start,end这两次字看到了么???
    2000 2001 2002  2009  2010
      

  10.   

    group by TEAM having count(y) >= 2
      

  11.   

    select * from (
    select b.team team,min(y) miny,max(y) maxy 
    from (select team,y from t_test2 order by team,y) b
    group by b.team,to_number(b.y-ROWNUM)
    ) c where miny != maxy另外一帖子里面一位高人写的。这sql确实有点难,规律不太容易看出来,我没调试出来,看到另帖子的人写了才恍然大悟。先根据team和y排序。然后将结果中的y-ROWNUM。这样子再根据team和y-ROWNUM排序后,miny和maxy不相等的那些就是结果了。
      

  12.   

    这种sql能写出来的话,有点水平了确实,作为面试题目感觉有点难了。
      

  13.   

    select *
      from (select t.team, min(t.y) i, max(t.y) k from t group by t.team) a
     where a.i <> a.k试试这条SQL看看。
      

  14.   


    Select TEAM, MIN(Y) START_HM, MAX(Y) END_HM From dbo.T_Team_Champ
      Where TEAM in (Select TEAM From (Select TEAM, Count(*) CHA_COUNT 
                            From dbo.T_Team_Champ Group By TEAM Having Count(*) >= 2) a) Group By TEAM
      

  15.   

    学习了,select tm,miny,maxy from (
    select team tm,min(y) miny,max(y) maxy from (
    select team,y from t order by team,y)
    group by team,y-rownum) 
    where miny-maxy<>0;
    公牛 1996 1998
    火箭 1994 1995
    公牛 1992 1993
    湖人 2000 2002
    湖人 2009 2010