2016-05-05 2 views
-1

Мой упрощена SQL таблица имеет 3 колонки:Удалить строки Перед УСЛОВИЕ в SQL

Series_Group
Series_Index
Series_Value

Для каждой группы, у меня есть диапазон значений ряда, которые могут включать в себя 0. Мне нужны только значения после последнего 0. Поэтому я хочу сделать запрос вроде:
Для каждой группы найдите индекс, где произошел нуль, затем удалите все строки в этой группе с более ранними индексами.

+-------+-------+-------+ 
| Group | Index | Value | 
+-------+-------+-------+ 
|  1 |  1 |  1 | 
|  1 |  2 |  0 | 
|  1 |  3 |  1 | 
|  1 |  4 |  0 | 
|  1 |  5 |  6 | 
|  2 |  1 |  1 | 
|  2 |  2 |  0 | 
|  2 |  3 |  1 | 
|  2 |  4 |  5 | 
|  3 |  1 |  5 | 
+-------+-------+-------+ 

я должен только держать

+-------+-------+-------+ 
| Group | Index | Value | 
+-------+-------+-------+ 
|  1 |  5 |  6 | 
|  2 |  3 |  1 | 
|  2 |  4 |  5 | 
|  3 |  1 |  5 | 
+-------+-------+-------+ 
+1

что ваша РСУБД? –

+0

почему строки из группы 2 показывают, если ни один из них не имеет значение «Value = 0' ?? –

ответ

1

Это один из способов сделать это с помощью union all.

Первая часть получает все последующие строки, где по крайней мере одно значение = 0 для каждой группы.

Во второй части вы получите все группы, в которых нет нулей в группе.

Sample demo

select t.* 
from tablename t 
join (select grp,max(index) as mxindex from tablename where value = 0 group by grp) t1 
on t.grp = t1.grp and t.index > t1.mxindex 
union all 
select * from tablename 
where grp in (select grp from tablename group by grp having sum(case when value = 0 then 1 else 0 end) = 0) 
2

вы можете попробовать что-то вроде этого

select * 
from table as a 
where index > coalesce((select max(index) 
    from table as b 
    where a.group=b.group and b.value=0),-1) 
0

Попробуйте с not exists:

select * from table t1 
where value <> 0 and not exists(select * from table t2 
           where t1.group = t2.group and 
             t2.index > t1.index and 
             t2.value = 0) 
+0

Я не уверен в групповом фильтре ... OP говорит, что вывод включает строки из 'group = 2', а не 0 –

+0

Этот запрос должен возвращать требуемые строки. Он навязывал «за каждую группу». –

+0

Извините, но не похоже на правильный результат. http://i.stack.imgur.com/qOXns.png –

0

Использование SQL Server. Вы можете использовать row_number, чтобы создать row_id.

SQL Demo

WITH cte 
    AS (SELECT [group], 
       [index], 
       [value], 
       ROW_NUMBER() 
        OVER (ORDER BY [group], [index]) AS rn 
     FROM table1), 
    last_zero 
    AS (SELECT Max(rn) rn 
     FROM cte 
     WHERE [value] = 0) 
SELECT c.[group], 
     C.[index], 
     C.[value] 
FROM cte C 
     CROSS JOIN last_zero L 
WHERE C.rn > L.rn 
+0

Я пробовал ваш код и, пока он работает с образцами данных, которые я изначально предоставлял, он не делает этого для каждой «группы». Я сделал небольшую модификацию данных (в моем вопросе), и код не вернет правильный ответ. – user2864154

+0

Да, вы не поняли вопрос. Я не понял, нужна ли вам каждая строка после 0, но внутри группы ... или в моем случае остальные строки. Я рекомендую вам попробовать решение @vkp. –

0

Аналогично решению Хуана Карлоса Оропеза, но без КТР

DECLARE @t TABLE ([Group] INT, [Index] INT, [Value] INT) 
INSERT INTO @t VALUES (1,1,1) 
INSERT INTO @t VALUES (1,2,0) 
INSERT INTO @t VALUES (1,3,1) 
INSERT INTO @t VALUES (1,4,0) 
INSERT INTO @t VALUES (1,5,6) 
INSERT INTO @t VALUES (2,1,1) 
INSERT INTO @t VALUES (2,2,5) 

SELECT * FROM 
(
    SELECT ROW_NUMBER() OVER (ORDER BY [Group], [Index]) AS RowNum, * 
    FROM @t 
) AS t1 
JOIN 
(
    SELECT MAX(t3.RowNum) AS MaxRow, t3.[Group] 
    FROM 
    ( 
    SELECT t2.RowNum, t2.[Group] FROM 
    ( 
     SELECT ROW_NUMBER() OVER (ORDER BY [Group], [Index]) AS RowNum, * 
     FROM @t 
    ) AS t2 
    WHERE t2.Value = 0 
) AS t3 
    GROUP BY t3.[Group] 
) AS t4 ON t1.[Group] = t4.[Group] AND t4.MaxRow < t1.RowNum 
0

Другой вариант:

select t.* from Table1 t 
left outer join ( 
    select [Group], 
    max(case when [Value] = 0 then [Index] else 0 end) zero_index 
    from Table1 
    group by [Group] 
) a 
on t.[Group] = a.[Group] 
where t.[Index] > a.zero_index; 
Смежные вопросы