Нахождение разницы между двумя наборами данных из одной таблицы - PullRequest
0 голосов
/ 16 февраля 2012

Мои данные выглядят так:

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, но, конечно, меня интересует общее объяснение, которое поможет мне обернуть голову вокруг концепции.

РЕДАКТИРОВАТЬ: ОК, это моепервый пост здесь, поэтому, пожалуйста, прости, если я не сформулировал вопрос достаточно точно.

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

Ответы [ 4 ]

0 голосов
/ 16 февраля 2012

Немного другой подход:

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

Между прочим, я предполагаю, что столбец «group» в вашей таблице на самом деле не называется group - это зарезервированное слово в SQL и его необходимо заключать в двойные кавычки (или обратные кавычки или квадратные скобки, в зависимости от того, какая СУБД) вы используете).

0 голосов
/ 16 февраля 2012

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

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

Обновление:

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

0 голосов
/ 16 февраля 2012
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 голосов
/ 16 февраля 2012
select * from yourtable
where run = 2 and checksum = (select max(checksum) 
                              from yourtable)
...