2012-02-16 4 views
0

Мои данные выглядит следующим образом:найти разницу между двумя наборами данных из той же таблицы

run | line | checksum | group 
----------------------------- 
1 | 3 | 123  | 1 
1 | 7 | 123  | 1 
1 | 4 | 123  | 2 
1 | 5 | 124  | 2 
2 | 3 | 123  | 1 
2 | 7 | 123  | 1 
2 | 4 | 124  | 2 
2 | 4 | 124  | 2 

и мне нужен запрос, который возвращает мне новые записи в перспективе 2

run | line | checksum | group 
----------------------------- 
2 | 4 | 124  | 2 
2 | 4 | 124  | 2 

Я пытался несколько вещей, но я не получил удовлетворительного ответа. В этом случае я использую H2, но, конечно, меня интересует общее объяснение, которое поможет мне обернуть голову вокруг концепции.

EDIT: ОК, это мое первое сообщение здесь, пожалуйста, простите, если я не сформулировал вопрос достаточно точно.

Обычно заданные два значения запуска (r1, r2, с r2> r1) Я хочу определить, какие строки, имеющие row = r2, имеют другую строку, контрольную сумму или группу из любой строки, где row = r1.

+2

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

+5

Как вы определяете, что запись новая? –

+0

Что вы подразумеваете под новыми записями в run 2? Я не вижу ничего. –

ответ

0
select * from yourtable 
where run = 2 and checksum = (select max(checksum) 
           from yourtable) 
0

Предположим, что ваш последний пробег будет иметь большее значение пробега, чем другие, ниже SQL поможет

select * from table1 t1 
where t1.run in 
(select max(t2.run) table1 t2) 

Update:

Выше SQL не может дать вам правильные строки, потому что ваш требование не так ясно. Но общая идея состоит в том, чтобы извлекать строки на основе последних параметров запуска.

0
SELECT line, checksum, group 
    FROM TableX 
    WHERE run = 2 

EXCEPT 

SELECT line, checksum, group 
    FROM TableX 
    WHERE run = 1 

или (с несколько иной результат):

SELECT * 
    FROM TableX x 
    WHERE run = 2 
    AND NOT EXISTS 
     (SELECT * 
      FROM TableX x2 
      WHERE run = 1 
      AND x2.line = x.line 
      AND x2.checksum = x.checksum 
      AND x2.group = x.group 
     ) 
0

несколько иной подход:

select min(run) run, line, checksum, group 
from mytable 
where run in (1,2) 
group by line, checksum, group 
having count(*)=1 and min(run)=2 

Кстати, я полагаю, что столбец "группа" в таблице не фактически называемая группа - это зарезервированное слово в SQL и должно быть заключено в двойные кавычки (или обратные выходы или квадратные скобки, в зависимости от того, какие RDBMS вы используете).

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