2013-09-24 38 views
0

我有一個數據集這樣的 -分組計數

**Team Date W/L** 
Team_1 04/01/0012 W 
Team_1 06/01/0012 W 
Team_1 07/01/0012 L 
Team_1 14/01/0012 W 
Team_1 19/01/0012 W 
Team_1 30/01/0012 L 
Team_1 14/02/0012 W 
Team_1 17/02/0012 L 
Team_1 20/02/0012 W 
Team_2 01/01/0012 W 
Team_2 05/01/0012 W 
Team_2 09/01/0012 W 
Team_2 13/01/0012 L 
Team_2 18/01/0012 W 
Team_2 25/01/0012 L 
Team_2 05/02/0012 L 
Team_2 13/02/0012 L 
Team_2 19/02/0012 L 
Team_3 02/01/0012 W 
Team_3 02/01/0012 W 
Team_3 06/01/0012 W 
Team_3 10/01/0012 W 
Team_3 19/01/0012 W 
Team_3 31/01/0012 L 
Team_3 11/02/0012 W 
Team_3 15/02/0012 L 
Team_3 21/02/0012 W 

而從這個我需要找出誰了最大的連續勝 -

隊計數

Team_3 5 
Team_2 3 
Team_1 2 

我被允許只寫sql查詢。我怎麼寫這個?

+0

您正在使用的數據庫? (SQL Server,MySQL,Oracle,...) – Andomar

+0

它是Oracle 11g。 –

回答

2

您可以使用以下方法:

SELECT Team, TotalWins, FirstWin, LastWin 
FROM ( SELECT Team, 
        WL, 
        COUNT(*) TotalWins, 
        MIN("Date") FirstWin, 
        MAX("Date") LastWin, 
        ROW_NUMBER() OVER(PARTITION BY Team, WL ORDER BY COUNT(*) DESC) RowNumber 
      FROM ( SELECT Team, 
           "Date", 
           WL, 
           ROW_NUMBER() OVER(PARTITION BY Team ORDER BY "Date") - ROW_NUMBER() OVER(PARTITION BY Team, WL ORDER BY "Date") Grouping 
         FROM T 
        ) GroupedData 
      WHERE WL = 'W' 
      GROUP BY Team, WL, Grouping 
     ) RankedData 
WHERE RowNumber = 1; 

它使用ROW_NUMBER排名每場比賽的球隊進行分配,也因此,這兩者之間的區別是每個組連續的結果是唯一的。因此,對於你的第一個隊你會:

Team Date  W/L RN1  RN2 DIFF 
Team_1 04/01/0012 W 1  1 0 
Team_1 06/01/0012 W 2  2 0 
Team_1 07/01/0012 L 3  1 2 
Team_1 14/01/0012 W 4  3 1 
Team_1 19/01/0012 W 5  4 1 
Team_1 30/01/0012 L 6  2 4 
Team_1 14/02/0012 W 7  5 2 
Team_1 17/02/0012 L 8  3 5 
Team_1 20/02/0012 W 9  6 3 

凡RN1僅通過團隊劃分,並且RN2是團隊和結果的分區。

正如你所看到的,如果您要爲每個組連勝的去除損失則DIFF列遞增一:

Team Date  W/L RN1  RN2 DIFF 
Team_1 04/01/0012 W 1  1 0 
Team_1 06/01/0012 W 2  2 0 
--------------------------------------- 
Team_1 14/01/0012 W 4  3 1 
Team_1 19/01/0012 W 5  4 1 
--------------------------------------- 
Team_1 14/02/0012 W 7  5 2 
--------------------------------------- 
Team_1 20/02/0012 W 9  6 3 

然後,您可以通過該組,以確保你正在尋找連勝,並做點數以獲得最大收益。然後我再用另一個rownumber來獲得每支球隊最高的連續勝利。

Example on SQL Fiddle