2016-08-19 66 views
-2

我有這樣的數據:分組在SQL Server中的批處理

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 
1 | 7 |09/08/2015 |1 
1 | 8 |16/08/2015 |2 
1 | 8 |17/08/2015 |2 
1 | 7 |19/08/2015 |3 
1 | 7 |15/08/2015 |3 
2 | 7 |01/08/2015 |4 
2 | 7 |02/08/2015 |4 
2 | 8 |16/08/2015 |5 
2 | 8 |17/08/2015 |5 
2 | 7 |26/08/2015 |6 
2 | 7 |28/08/2015 |6 

即用於標識和等級的每一塊我希望添加的新列和更新相同。

+4

編號背後的邏輯是什麼? – TheGameiswar

+0

它是批次ID的組合,即我試圖在新列的基礎上實現最短日期。在這裏相同的ID 7重複2批次,所以我必須得到每批的最低日期...例如對於第一批o/p將是1 | 7 | 07/08/2015 | 1 1 | 8 | 16/08/2015 | 2 1 | 7 | 15/08/2015 | 3 – user2941762

+0

@ user2941762您能準確描述邏輯嗎?例如,對於ID = 1和等級= 7,爲什麼日期2015年7月8日和2015年8月9日的值等於1,並且19/08/2015和2015年8月15日的日期是相同的ID /等級3的值?我看到這裏沒有logi ... –

回答

0

我認爲你要找的是dense_rank。

看看下面的查詢是否有幫助。

DECLARE @Temp TABLE 
    ( 
    id INT,rank INT,data DATETIME 
) 

INSERT INTO @temp 
VALUES  (1,7,'08/07/2015'), 
      (1,7,'08/09/2015'), 
      (1,8,'08/16/2015'), 
      (1,8,'08/17/2015'), 
      (1,7,'08/19/2015'), 
      (1,7,'08/15/2015'), 
      (2,7,'08/01/2015'), 
      (2,7,'08/02/2015'), 
      (2,8,'08/16/2015'), 
      (2,8,'08/17/2015'), 
      (2,7,'08/26/2015'), 
      (2,7,'08/28/2015') 

SELECT *,Dense_rank() 
      OVER( 
      ORDER BY id, rank) AS New_Column 
FROM @Temp 
0

這是我試過的邏輯,它運行成功。謝謝大家。

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 * from #temp