2013-09-24 4 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 

Вы можете группу этим, чтобы убедиться, что вы смотрите на последовательных побед, и сделать счет, чтобы получить максимум. Затем я использовал еще один роутер, чтобы получить максимальные выигрыши подряд за команду.

Example on SQL Fiddle

Смежные вопросы