0

在下面的 SQL Server 表中,我希望将这些值带入新表,场景是:直到每个User_ID 达到值“1”(包括此迭代),循环应该继续。如果 User_ID 从下一次迭代中达到“1”,则循环应该退出并从下一个 User_ID 开始,依此类推。

User_ID | Value
---------------    
**167    | 0**
**167    | 0**
175    | 0
175    | 0
175    | 0
175    | 1
**167    | 1**
**167    | 0**
175    | 0
188    | 0
188    | 1
**167    | 1**
188    | 0
216    | 1
188    | 1
217    | 0

输出应该是这样的:

User_ID | Value
-----------------    
**167    | 0**
**167    | 0**
**167    | 1**
175    | 0
175    | 0
175    | 0
175    | 1
188    | 0
188    | 1
216    | 1
217    | 0
4

2 回答 2

1

你可以用这个...

create table #outTable
(
    rowID   int identity(1, 1),
    User_ID varchar(10),
    value   varchar(10),
)
insert into #outTable(User_ID, value)
select USER_ID, value
from   UserTable

declare @User_ID varchar(10),
        @value   varchar(10);
declare @break   int;    
declare @cnt int;
declare curUser cursor for select distinct User_ID from #outTable
open curUser 
fetch next from curUser into @user_ID
while @@FETCH_STATUS = 0 
begin
     SET @cnt = 0;
     SELECT @cnt = MIN(rowID)
     FROM   #outTable
     WHERE  User_ID = @user_ID AND value LIKE '1%';

     IF (@cnt > 1)
     BEGIN
        DELETE FROM #outTable WHERE User_ID = @user_ID AND rowID > @cnt;
     END 
     fetch next from curUser into @user_ID
end
close curUser;
deallocate curUser;

select * from #outTable order by USER_ID;
DROP TABLE #outTable  
于 2013-08-01T12:29:34.483 回答
1

这是一个可能的解决方案:

SELECT *, 
       Row_number () 
         OVER ( 
           PARTITION BY USER_ID 
           ORDER BY Newid()) RN 
INTO   #DATA 
FROM   TABLE1; 

WITH CTE 
     AS (SELECT *, 
                VALUE AS sumVal 
         FROM   #DATA 
         WHERE  RN = 1 
         UNION ALL 
         SELECT t1.USER_ID, 
                T1.VALUE, 
                T1.RN, 
                T1.VALUE + ( T2.SUMVAL * 2 ) AS SumVal 
         FROM   #DATA T1 
                INNER JOIN CTE T2 
                        ON T1.USER_ID = T2.USER_ID 
                           AND T1.RN = T2.RN + 1) 
SELECT USER_ID, 
       VALUE 
FROM   CTE 
WHERE  SUMVAL <= 1 

可以在SQL Fiddle上找到一个工作示例。

您会注意到每次都会得到不同的结果!
由于表本身没有定义顺序,因此我不得不向表中添加“随机”顺序。

于 2013-08-01T11:14:15.677 回答