2016-08-18 65 views
1

的基礎上我有一種情況,其中,我有獲取最小列的其他字段

Id|rank| date 
1 | 7 |07/08/2015 
1 | 7 |09/08/2015 
1 | 8 |16/08/2015 
1 | 8 |17/08/2015 
1 | 7 |19/08/2015 
1 | 7 |15/08/2015 
2 | 7 |01/08/2015 
2 | 7 |02/08/2015 
2 | 8 |16/08/2015 
2 | 8 |17/08/2015 
2 | 7 |26/08/2015 
2 | 7 |28/08/2015 

我所需的解決方案是

1 | 7 |07/08/2015 
1 | 8 |16/08/2015 
1 | 7 |15/08/2015 
2 | 7 |01/08/2015 
2 | 8 |16/08/2015 
2 | 7 |26/08/2015 

即用於我想id和秩的每個塊最短的日期。 我曾嘗試使用while循環,因爲有成千上萬的記錄它需要2小時load.Is有任何其他方式做請請建議。

+0

搜索類似「組SQL第一行」這是一個:http://stackoverflow.com/questions/3800551/select-first-row-in-each-group-按組 – shawnt00

+1

爲什麼1,7,15/08/2015爲07/08和15/08重複兩次一次兩次 – TheGameiswar

+0

不重複... 1和7重複,因爲我想輸出特定批次的ID和排名 – user2941762

回答

0

這裏是使用查詢ROW_NUMBER()

;WITH cte_rec 
    as (SELECT Id,Rank,Date 
        ,ROW_NUMBER()OVER (partition by Id,Rank ORDER BY date) as RNO 
     FROM YourTable) 
     SELECT Id,Rank,Date 
     FROM cte_rec 
     WHERE RNO =1 
+0

謝謝unni,但這不會達到慾望的結果 – user2941762

1

對於每一行利用必要爲了得到唯一的行號。 (因爲我比ID更重要,日期比排名更重要)。

使用移動了一行的行號(d1.RowNum = d2.RowNum+1)將結果表加入其自身。

只選擇加入「其他塊」行的行(d1.Id <> d2.Id or d1.Rank <> d2.rank)。

根據換檔方向和選定的表格選擇最大或最小日期。

不要忘記「邊緣案例」 - 由於移位不能加入的行(這就是爲什麼不使用inner joind1.RowNum = 1條件)。

;WITH dataWithRowNums as (
    select Id, Rank, Date, 
     RowNum = ROW_NUMBER() OVER (ORDER BY Id,date,rank) 
    from YourTable 
) 
select d1.Id, d1.Rank, d1.Date 
from dataWithRowNums d1 
left join dataWithRowNums d2 
    on d1.RowNum = d2.RowNum+1 and (d1.Id <> d2.Id or d1.Rank <> d2.rank) 
where not d2.Id is null or d1.RowNum = 1 

此代碼返回結果位不同從你:

Id Rank Date 
1 7 2015-08-07 
1 8 2015-08-16 
1 7 2015-08-19 <-- you've got here 2015-08-15 
2 7 2015-08-01 
2 8 2015-08-16 
2 7 2015-08-26 

作爲塊(等級8編號1)在16/08已經開始因此行15/08用於秩7是有關第一個塊(等級7 Id1)。

如果您仍然需要你的排序(所以15/08等級7是與第二塊(rank7 ID1)),那麼你應該提供自己的RowSorting數據,然後在這裏問關於另一個任務的另一個解決方案)

0
This is what I have tried and is running as expected 
create table #temp 
    (
      iden int identity(1,1), 
      ID int, 
      [rank] int, 
      [date] date, 
      dr_id int, 
      rownum_id int, 
      grouprecord int 
    ) 


    Insert into #temp(id,rank,date) 
    select 1 , 7 ,'07/08/2015' 
    union all select 1 , 7 ,'09/08/2015' 
    union all select 1 , 8 ,'08/16/2015' 
    union all select 1 , 8 ,'08/17/2015' 
    union all select 1 , 7 ,'08/19/2015' 
    union all select 1 , 7 ,'08/15/2015' 
    union all select 2 , 7 ,'08/01/2015' 
    union all select 2 , 7 ,'08/02/2015' 
    union all select 2 , 8 ,'08/16/2015' 
    union all select 2 , 8 ,'08/17/2015' 
    union all select 2 , 7 ,'08/26/2015' 
    union all select 2 , 7 ,'08/28/2015' 


    update t1 
    set dr_id = t2.rn 
    from #temp t1 inner join 
    (select iden, dense_rank() over(order by id) as rn from #temp) t2 
    on t1.iden = t2.iden 


    update t1 
    set rownum_id = t2.rn 
    from #temp t1 inner join 
    (select iden, row_number() over(partition by dr_id order by id) as rn from #temp) t2 
    on t1.iden = t2.iden 




    select *,row_number() over(order by iden)rn into #temp1 from 
    (    
         select t2.* 
        from #temp t1 inner join #temp t2 
        on (t1.dr_id = t2.dr_id or t2.dr_id = (t1.dr_id +1)) and (t1.rank<>t2.rank or t2.dr_id = (t1.dr_id +1)) 
        and t2.iden = t1.iden + 1 
    )a 





    declare @id int,@miniden int,@maxiden int,@maxid int 
    set @id = 1 
    select @maxid = max(iden) from #temp 

    while exists(select 1 from #temp1 where rn = @id) 
    begin 
      Select @miniden = iden from #temp1 
      where rn = @id 

      Select @maxiden = iden from #temp1 
      where rn = @id+1 

      update #temp 
      set grouprecord = @id +1 
      where iden between @miniden and @maxiden 

    IF(@maxiden IS NULL) 
    BEGIN 
      Update #temp 
      set grouprecord = @id +1 
      where iden between @miniden and @maxid 
    END 

      set @id = @id + 1 
      SET @miniden =NULL 
      SET @maxiden = NULL 
    end 

    UPDATE #TEMP 
    SET GROUPRECORD = 1 
    WHERE GROUPRECORD IS NULL 



    select min(date) as mindate,grouprecord from #temp 
    group by grouprecord 

謝謝大家的幫助:)

相關問題