Как создать номер строки на основе определенного условия? - PullRequest
0 голосов
/ 05 октября 2019

У меня есть столбец с именем type, имеющий values 1 and 2. я хочу создать столбцы ожидаемых результатов.

В этом столбце value 2 должно быть converted to 0, а для consecutive 1's должно генерироваться Row number. Пожалуйста, обратитесь к этому изображению ...

enter image description here

Любой, посоветуйте, как этого добиться.

не хватает логики. :(

Ответы [ 3 ]

0 голосов
/ 05 октября 2019

Это лучший способ использования курсоров

CREATE TABLE [dbo].[Table_1](
[Type] [int] NULL)

Код объявления @Type int = 0

DECLARE @Test TABLE(
 [Type] INT ,
 [ExpectedResult] INT
)


DECLARE vendor_cursor CURSOR FOR   
SELECT [Type] 
FROM [dbo].[Table_1]

OPEN vendor_cursor  
FETCH NEXT FROM vendor_cursor   
INTO @Type

Declare @ExpectedResult INT = 0

WHILE @@FETCH_STATUS = 0  
BEGIN  
    IF @Type = 2
    SET @ExpectedResult = 0
    ELSE
        SET @ExpectedResult+= 1

INSERT INTO @Test ([Type] ,[ExpectedResult] ) VALUES(@Type , @ExpectedResult)

FETCH NEXT FROM vendor_cursor   
INTO @Type 
END   
CLOSE vendor_cursor;  
DEALLOCATE vendor_cursor;  

SELECT * FROM @Test
0 голосов
/ 05 октября 2019

Во-первых, вы предполагаете, что в ваших строках есть порядок, но столбец порядка не указан. Таблицы SQL представляют неупорядоченные множества. Без такого столбца нет порядка.

Позвольте мне предположить, что у вас есть один.

Тогда этопроблема разрывов и островков. Вы хотите острова типа = 1, чтобы вы могли перечислить их. Вы можете идентифицировать их, выполнив совокупную сумму type = 2 - эта совокупная сумма определяет группировку смежных type = 1 записей. Остальное - просто row_number():

select t.*,
       (case when type = 2 then 0
             else row_number() over (partition by type, grp order by <ordering col>)
        end) as expected_result
from (select t.*,
             sum(case when type = 2 then 1 else 0 end) over (order by <ordering col>) as grp
      from t
     ) t;

Здесь - это дБ <> скрипка.

0 голосов
/ 05 октября 2019

Пожалуйста, попробуйте это:

select *,0 as RowNo into #tmp from YourTable

declare @id int
set @id=0
update #tmp
set @id = case typeId when 1 then @id+1 else 0 end,
    RowNo = case typeId when 1 then @id else 0 end
select * from #tmp  
drop table #tmp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...