2014-08-29 18 views
0
;with sub as 
(
    select 
     x.*, 
     row_number() over(partition by wdl order by id) - row_number() over(order by id) as grp 
    from 
     (select 
      id, hometeam as team, wdl 
     from 
      #HomeTeam_vs_AwayTeam 
     where 
      hometeam = @Team 

     union all 

     select 
      id, awayteam,wdl 
     from 
      #HomeTeam_vs_AwayTeam 
     where 
      awayteam = @Team) x 
) 
INSERT INTO #Team_Streak([Team], [WDL], [Streak]) 
    (select 
     team, wdl, count(*) as count 
    from 
     sub 
    where 
     grp = (select grp from sub where id = (select max(id) from sub)) 
    group by 
     team, wdl) 

爲什麼這個查詢給我一個不同的結果,有時會給我兩個結果?SQL Server給我一個不同的結果

我使用的是SQL Server 2012的

+2

看看數據。這將是顯而易見的。 – 2014-08-29 22:20:38

+1

我認爲一個更好的問題是這個查詢應該做什麼? '#HomeTeam_vs_AwayTeam'也是'id'唯一。對於一個給定的「ID」,同一個團隊可以回家嗎? – Laurence 2014-08-29 22:46:29

+0

它的計數最後@team連勝數據是好的我有一些球隊的準確計數我有兩個結果 – 2014-08-30 07:41:22

回答

0

的基本問題是,這樣grp計算並沒有把條紋成唯一的組。 看看下面的數據#HomeTeam_vs_AwayTeam,例如:

id | hometeam | awayteam | wdl 
---+----------+----------+---- 
1 | team A | team B | W 
2 | team A | team B | L 
3 | team A | team B | W 

如果你看看這是什麼產生子,它是:

id | team | wdl | grp 
---+--------+-----+---- 
1 | team A | W | 0 
2 | team A | L | -1 
3 | team A | W | -1 

grp -1WL值。這是因爲row_number() over (partition by wdl order by id)不會在條紋之間重置。 Example SQLFiddle

一個解決它的辦法是下面,但感覺這應該是能夠簡化

with results as (
    select 
     id, hometeam as team, wdl 
    from 
     #HomeTeam_vs_AwayTeam 
    where 
     hometeam = @Team 
    union all 
    select 
     id, awayteam,wdl 
     -- wdl should probably be 
     -- case wdl when 'W' then 'L' when 'D' then 'D' when 'L' then 'W' end 
    from 
     #HomeTeam_vs_AwayTeam 
    where 
     awayteam = @Team 
), sub as (
    select 
     results.*, 
     row_number() over(order by id) as rn, 
     lag(wdl) over (order by id) as prev_wdl 
    from 
     results 
), limits as (
    select 
     max(id) id, 
     max(rn) - max(case when wdl != prev_wdl then rn else 1 end) + 1 streak 
    from 
     sub 
) select 
    results.team, 
    results.wdl, 
    limits.streak 
from 
    limits 
     inner join 
    results 
     on limits.id = results.id 

Example SQLFiddle

相關問題