Сравнение «последовательных» строк в Ms Access - PullRequest
1 голос
/ 27 марта 2012

У меня есть таблица, которая выглядит так:

ID   Subid      Time    Value     Value2
1        1       3       100       2
1        1       4       100       2
2        2       3       200       1       
2        2       4       200       2
4        4       4       10        4
5        6       3       10        2       
5        6       4       12        2

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

ID   Subid      Time    Value     Value2
2        2       3       200       1       
2        2       4       200       2
4        4       4       10        4
5        6       3       10        2       
5        6       4       12        2

Условия записи во второй части следующие: Если есть две записи с одинаковыми идентификатором и Subid, но с другим месяцем, проверьте, равны ли значения и значения2. Если они ОБА равны, удалите запись, иначе покажите запись. Если совпадения не найдены в другое время, также покажите запись. Как правило, в этой таблице будет много записей, которые соответствуют друг другу, поэтому я хочу упростить свою жизнь, разбрав их.

Я должен использовать MS Access (2010) для этого.

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ после ответа Рему:

Теперь у меня проблема в том, что у меня нет таблицы, показанной выше, но я создаю ее с помощью другого запроса. Так что сейчас я просто поместил запрос для создания этой таблицы в четырех местах, где его использует Рему ... Я уверен, что есть лучший способ сделать это, но я не могу понять это ...

SELECT t2.*</p> <p>FROM (SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value FROM </p> <p>( HUGE SELECT HERE with 3 joins) t</p> <pre><code> WHERE t.Time=4) AS t2 LEFT JOIN (SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value FROM

( ОГРОМНЫЙ ВЫБРАТЬ ЗДЕСЬ с 3 соединениями) т

    WHERE t.Time=3)  AS t1 
         ON t2.Id = t1.Id
         WHERE t2.value<>t1.value
         OR t2.value2<>t1.value2 
         OR t1.Id Is Null

UNION ALL

   SELECT t1.* FROM
   (SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value
    FROM

( ОГРОМНЫЙ ВЫБРАТЬ ЗДЕСЬ с 3 соединениями) t

     WHERE t.Time=3) AS t1
           LEFT JOIN
    (SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value
    FROM

( ОГРОМНЫЙ ВЫБРАТЬ ЗДЕСЬ с 3 соединениями) t

    WHERE t.Time=4) AS t2
          ON t1.Id=t2.Id
          WHERE t1.value<>t2.value
         OR t1.value2<>t2.value2 
          OR t2.Id Is Null

ORDER BY Id, EntryNo;

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Как насчет:

SELECT t2.*
FROM (SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM Test2 t
WHERE t.Time=4)  AS t2 LEFT JOIN (SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM Test2 t
WHERE t.Time=3)  AS t1 ON t2.ID = t1.ID
WHERE t2.Value<>t1.Value 
OR t2.Value2<>t1.Value2 
OR t1.ID Is Null
UNION ALL
SELECT t1.* FROM
(SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM Test2 t
WHERE t.Time=3) t1
LEFT JOIN
(SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM Test2 t
WHERE t.Time=4) t2
ON t1.ID=t2.ID
WHERE t1.Value <> t2.Value
OR  t1.Value2 <> t2.Value2
OR t2.ID Is Null
ORDER BY ID
0 голосов
/ 18 декабря 2012

Поскольку это MS Access, как насчет создания запроса с двумя копиями t (Access вызывает второй t_1) (просто подключите каждое поле или посмотрите на это http://i49.tinypic.com/rix175.jpg.)

Затем щелкните правой кнопкой мыши,отредактируйте SQL, и вы должны увидеть что-то вроде этого:

    SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
    FROM t INNER JOIN t AS t_1 ON (t.Value2 = t_1.Value2) 
    AND (t.Value = t_1.Value) 
    AND (t.Subid = t_1.Subid) 
    AND (t.Time = t_1.Time-1) 
    AND (t.ID = t_1.ID);

Что вы можете переписать так:

    SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
    FROM t INNER JOIN t AS t_1 ON 
    (t.Time = t_1.Time-1)
    AND (t.ID = t_1.ID) 
    AND (t.Subid = t_1.Subid) 
    AND ((t.Value <> t_1.Value) OR (t.Value2 <> t_1.Value2));

Обратите внимание на "t.Time = t_1.Time-1"edit и оператор AND; это даст вам результаты запроса из Time = 3. Теперь сделайте UNION для этого, слегка измененного, на этот раз с" t.Time-1 = t_1.Time "вместо этого, чтобы получить Time =Результаты 4. Затем добавьте один в конце, чтобы поймать уникальные записи:

    SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
    FROM t INNER JOIN t AS t_1 ON 
    (t.Time = t_1.Time-1) 
    AND (t.ID = t_1.ID) 
    AND (t.Subid = t_1.Subid) 
    AND ((t.Value <> t_1.Value) OR (t.Value2 <> t_1.Value2))

    UNION SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
    FROM t INNER JOIN t AS t_1 ON 
    (t.Time-1 = t_1.Time)  
    AND (t.ID = t_1.ID)
    AND (t.Subid = t_1.Subid) 
    AND ((t.Value <> t_1.Value) OR (t.Value2 <> t_1.Value2))

    UNION SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
    FROM t INNER JOIN t AS t_1 ON 
    (t.Time-1 = t_1.Time) 
    AND (t.ID <> t_1.ID) 
    AND (t.Subid <> t_1.Subid);
...