2013-01-03 3 views
1

Есть ли способ сделать следующий прогноз в SQL? Удалить строки, где второй столбец не изменяется в зависимости от заказа?SQL удалить дубликат заказа

FROM   TO 
1 504  1 504 
2 508  2 508 
3 504  3 504 
4 504  7 508 
5 504  8 504 
6 504  9 508 
7 508  10 504 
8 504  15 508 
9 508  16 504 
10 504   
11 504   
12 504   
13 504   
14 504   
15 508   
16 504   
17 504   
18 504   
19 504 
+2

Какая платформа? SQL Server? MySQL? Это возможно с помощью оконных функций. – NYCdotNet

+0

Возможно, что-то вроде 'SELECT id, value FROM table WHERE id IN (1, 2, 3, 7, 8, 9, 10, 15, 16);'? – Oldskool

+0

Мы используем MSSQL – pufferfish

ответ

1

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

select a.* 
from (select t.* 
      (select max(id) from t t2 where t2.id < t.id) as pevid 
     from t 
    ) a left outer join 
    t aprev 
    on a.previd = aprev.id 
where aprev.value <> a.value or aprev.value is null 

Это действительно реализация функции lag(), но без функций окна.

Вы также можете написать это, используя верхний/предел/ROWNUM и делать заказ, в подзапрос:

select a.* 
from (select t.* 
      (select top 1 id from t t2 where t2.id < t.id order by id desc) as pevid 
     from t 
    ) a left outer join 
    t aprev 
    on a.previd = aprev.id 
where aprev.value <> a.value or aprev.value is null 

Это, в свою очередь, может быть упрощена, чтобы удалить последний присоединиться:

select a.* 
from (select t.* 
      (select top 1 val from t t2 where t2.id < t.id order by id desc) as pevval 
     from t 
    ) 
where a.prevval <> a.value or a.prevval is null 
2

В зависимости от RDBMS вы используете вы можете использовать LAG и LEAD аналитические функции, чтобы посмотреть на предыдущей/следующей строке.

SELECT 
    a.* 
FROM (
    SELECT 
    id 
    , value 
    , LAG(value) OVER (ORDER BY id) previous_value 
    FROM some_table 
) a 
WHERE a.previous_value IS NULL OR a.value != a.previous_value 

Здесь вид рядный тянет данные из включая столбец, который имеет предыдущее значение строк (при заказе по идентификатору). Предложение WHERE во внешнем запросе исключает строки, где значение совпадает с предыдущим (и обязательно включает первую строку, которая, очевидно, имеет значение NULL previous_value).

+0

Получаю следующее сообщение. Msg 11305, уровень 15, состояние 10, строка 7 Функции Parallel Data Warehouse (PDW) не включены. – pufferfish

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