2017-03-23 17 views
3

私はゲームの日付と結果(0手段が失われ、1勝)を持つテーブルを持っているリナンバリング連続した値

+------+--------------+--------+ 
| id | game_date | result | 
+------+--------------+--------+ 
| 1 | '2016-09-01' | 1  | 
| 2 | '2016-09-02' | 1  | 
| 3 | '2016-09-03' | 0  | 
| 4 | '2016-09-04' | 1  | 
| 5 | '2016-09-04' | 1  | 
| 6 | '2016-09-04' | 1  | 
| 7 | '2016-09-05' | 1  | 
| 8 | '2016-09-06' | 0  | 
| 9 | '2016-09-07' | 1  | 

私は勝利を(日付順)連続しているすべての勝利を、得る必要があり、1から番号を付け直します最後に勝つ

結果はこのようになります。

+------+--------------+--------+------------ 
| id | game_date | result | 
+------+--------------+--------+------------- 
| 1 | '2016-09-01' | 1  | 1 
| 2 | '2016-09-02' | 1  | 2 
| 3 | '2016-09-03' | 0  | 
| 4 | '2016-09-04' | 1  | 1 
| 5 | '2016-09-04' | 1  | 2 
| 6 | '2016-09-04' | 1  | 3 
| 7 | '2016-09-05' | 1  | 4 
| 8 | '2016-09-06' | 0  | 
| 9 | '2016-09-07' | 1  | 1 
+0

結果の列は常に0または1を持っているのだろうか? – GurV

+0

はい常に0または1 – genadi

+0

SQL Serverの場合はどのバージョンですか? –

答えて

3

あなたは隣接する値のグループを識別することによってこれを行うことができます。単純な方法は行番号の違いです。もう一つの方法は、それぞれ「0」値の最大日付を割り当てることです:

select id, game_date, result, 
     (case when result = 1 
      then row_number() over (partition by result, max_gamedate order by id) 
     end) as newcol 
from (select t.*, 
      max(case when result = 0 then game_date end) over 
       (order by id) as max_gamedate 
     from t 
    ) t 
+0

代わりに 'order by id'を使用してください。 Game_dateは時々同じで、間違った結果が出るかもしれません。 – GurV

+0

これは私が始めていたアプローチよりもはるかに簡単です。 +1 – SqlZim

+0

非常にいい解決策 –

0
DECLARE @games TABLE (
    id INT, 
    game_date DATE, 
    result INT 
); 
INSERT INTO @games 
VALUES 
(1, '2016-09-01', 1), 
(2, '2016-09-02', 1), 
(3, '2016-09-03', 0), 
(4, '2016-09-04', 1), 
(5, '2016-09-04', 1), 
(6, '2016-09-04', 1), 
(7, '2016-09-05', 1), 
(8, '2016-09-06', 0), 
(9, '2016-09-07', 1); 

WITH CTE AS(
    select t3.*, COUNT(collect) OVER(PARTITION BY collect) as collect_count FROM (
     select t.*, t2.rn, sum(result) over(order by game_date, t.id) as collect from @games t 
     left join (
      SELECT id, row_number() over(order by game_date, id) as rn 
      FROM @games t where result = 1 
     ) t2 
     on t.id = t2.id 
    )t3 
) 
select CTE.id, CTE.game_date, CTE.result, rn - COALESCE((SELECT MAX(collect) FROM CTE innert WHERE collect < CTE.rn and collect_count > 1) , 0) sequence_number 
FROM CTE 
order by game_date, id 
関連する問題