2014-09-24 2 views
1

Привет, у меня сложное условие. У меня есть таблица позволяет сказать «Test»Выберите следующую следующую строку на основе текущей строки

ID Partner Type  Amount 
143854 CSTC Purchase -0.81 
144029 CSTC Purchase -0.69 
144030 CSTC Purchase -1.33 
144031 CSTC Purchase -0.47 
144032 CSTC Purchase -1.8 
149527 CSTC div   1574.48 
149528 CSTC Purchase -1574.48 
149531 CSTC div   867.53 
149532 CSTC Purchase -867.53 
149539 CSTC div   76.2 
149540 CSTC Purchase -76.2 
149550 CSTC div   8.77 
149551 CSTC Purchase -8.77 
149554 CSTC div   700.45 
149555 CSTC Purchase -700.45 

Я хочу, чтобы удалить все вхождения строк, имеющих тип = «DIV» и следующий ряд должен иметь тип = «Покупка»

т.е. если type = 'div' и следующая строка type = 'Purchase' удалите оба остальных, я хочу выполнить некоторое действие обновления в строке, имеющей type = 'div'.

Я пробовал Свод, я могу получить следующие строки Тип col value, но это не помогает.

select LEAD([Type]) OVER (ORDER BY ID) Next, ID, Partner,[Type],Amount from Test where date='9/18/2014' and ([Type] = 'div' or [Type] = 'Purchase') 
+1

sql server 2008 no no t support LEAD() –

+0

Я пробовал его с сервером Sql 2012 –

+0

, но это не то, как вы отметили вопрос ... –

ответ

0

Миллер был близок левый разрывалось его

WITH TestWithRowNumber AS 
(
    SELECT *, 
    ROW_NUMBER() OVER (ORDER BY ID ASC) AS RowNumber 
    FROM Test 
) 
Select * 
    From TestWithRownumber FirstRow 
    join TestWithRownumber secondrow 
    on secondrow.RowNumber = firstrow.RowNumber + 1 
    and secondrow.type = 'Purchase' 
    and firstrow.type = 'div' 

, как и для исключить заявление

WITH TestWithRowNumber AS 
(
    SELECT *, 
    ROW_NUMBER() OVER (ORDER BY ID ASC) AS RowNumber 
    FROM Test 
) 
delete Test 
    From TestWithRownumber FirstRow 
    join TestWithRownumber secondrow 
    on secondrow.RowNumber = firstrow.RowNumber + 1 
    and secondrow.type = 'Purchase' 
    and firstrow.type = 'div' 
    join test 
    on test.ID = FirstRow.ID 
    or test.ID = secondrow.ID 
0

пожалуйста, помните, таблица представляет собой набор и набор не имеет никакого порядка ни сверху вниз или слева right.What, если кто-то вставляет строку для типа = Div снова ??. Однако попробуйте следующий код, чтобы увидеть, если он работает или нет

DECLARE @T TABLE (ID INT,[Partner] VARCHAR(10), [Type] VARCHAR(20),Amount decimal (10,2)) 
INSERT INTO @T 
VALUES 
(143854 ,'CSTC' , 'Purchase ', -0.81) 
,(144029 , 'CSTC' , 'Purchase' , -0.69) 
,(144030 , 'CSTC', 'Purchase' , -1.33) 
,(144031 , 'CSTC', 'Purchase' , -0.47) 
,(144032 , 'CSTC' , 'Purchase' , -1.8) 
,(149527 , 'CSTC' , 'div'  , 1574.48) 
,(149528 , 'CSTC' , 'Purchase' , -1574.48) 
,(149531 , 'CSTC' , 'div'  , 867.53) 
,(149532 , 'CSTC' , 'Purchase' , -867.53) 
,(149539 ,'CSTC', 'div'  , 76.2) 
,(149540 ,'CSTC' , 'Purchase' , -76.2) 
,(149550 , 'CSTC' , 'div'  , 8.77) 
,(149551 , 'CSTC' , 'Purchase' , -8.77) 
,(149554 , 'CSTC', 'div'  , 700.45) 
,(149555 , 'CSTC', 'Purchase' , -700.45) 


;with cte as 
(
select * 
,(SELECT TOP 1 Amount FROM @t WHERE ID > t.ID AND [type] = 'purchase' ORDER BY ID ASC) as nxt 
,(SELECT TOP 1 Amount FROM @t WHERE ID < t.ID AND [type] = 'div' ORDER BY ID DESC) AS pvs 
FROM @T T 
) 

DELETE FROM cte WHERE (Amount + nxt = 0) OR (Amount + pvs = 0) 

select * FROM @T 
+0

ОК я проверю его. Спасибо –

+0

не работает. –

0

Мое решение с LEAD:

IF OBJECT_ID('Test1', 'U') IS NOT NULL 
    DROP TABLE Test1; 
go 

CREATE TABLE Test1 (ID  INTEGER NOT NULL 
,     Partner VARCHAR(100) NOT NULL 
,     Type VARCHAR(20) NOT NULL 
,     Amount FLOAT NOT NULL); 
go 

INSERT INTO Test1 (ID,  Partner, Type,  Amount ) 
VALUES   (143854, 'CSTC', 'Purchase', -0.81 ) 
,     (144029, 'CSTC', 'Purchase', -0.69 ) 
,     (144030, 'CSTC', 'Purchase', -1.33 ) 
,     (144031, 'CSTC', 'Purchase', -0.47 ) 
,     (144032, 'CSTC', 'Purchase', -1.8 ) 
,     (149527, 'CSTC', 'div  ', 1574.48 ) 
,     (149528, 'CSTC', 'Purchase', -1574.48) 
,     (149531, 'CSTC', 'div  ', 867.53 ) 
,     (149532, 'CSTC', 'Purchase', -867.53 ) 
,     (149539, 'CSTC', 'div  ', 76.2 ) 
,     (149540, 'CSTC', 'Purchase', -76.2 ) 
,     (149550, 'CSTC', 'div  ', 8.77 ) 
,     (149551, 'CSTC', 'Purchase', -8.77 ) 
,     (149554, 'CSTC', 'div  ', 700.45 ) 
,     (149555, 'CSTC', 'Purchase', -700.45 ) 
go 

WITH CTE_LEAD 
AS 
(
    SELECT LEAD([Type]) OVER (ORDER BY ID) NextType 
    ,  ID 
    ,  Partner 
    ,  [Type] 
    ,  Amount 
    from Test1 
) 
SELECT * 
FROM CTE_LEAD 
WHERE NextType = 'Purchase' AND Type = 'div'; 

WITH CTE_LEAD 
AS 
(
    SELECT LEAD([Type]) OVER (ORDER BY ID) NextType 
    ,  ID 
    ,  Partner 
    ,  [Type] 
    ,  Amount 
    from Test1 
) 
DELETE FROM Test1 
WHERE ID IN (
    SELECT ID 
    FROM CTE_LEAD 
    WHERE NextType = 'Purchase' AND Type = 'div' 
    UNION ALL 
    SELECT ID + 1 
    FROM CTE_LEAD 
    WHERE NextType = 'Purchase' AND Type = 'div' 
    ); 
+0

Не работает. –

Смежные вопросы