Поиск смежных областей в отсортированном запросе MS Access - PullRequest
1 голос
/ 08 февраля 2012

Я давний поклонник Stack Overflow, но я столкнулся с проблемой, которую еще не нашел, и мне нужна помощь специалиста.У меня есть запрос, который отсортирован в хронологическом порядке с составным ключом даты и времени (уникальный, никогда не удаляется) и несколькими частями данных.Я хочу знать, есть ли способ найти начало (или конец) региона, где значение изменяется?IE

DateTime someVal1 someVal2 someVal3 target

  1. 1 3 4 A
  2. 1 2 4 A
  3. 1 3 4 A
  4. 1 2 4 B
  5. 1 2 5 B
  6. 1 2 5 A

, и мой запрос возвращает строки 1, 4 и 6. Он находит изменение в столбце 5из А в Б, а затем из Б обратно в А?Я пробовал метод поиска дубликатов, используя min и max в свойстве totalals, однако он дает мне первый и последний общий результат вместо локальных max и min?Есть похожие проблемы?

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Я не видел никакой цели для полей someVal1, someVal2 и someVal3, поэтому я их пропустил. Я использовал автономный номер в качестве первичного ключа вместо вашего поля даты / времени; но этот подход также должен работать с вашим первичным ключом даты / времени. Это данные в моей версии вашей таблицы.

pkey_field target
1          A
2          A
3          A
4          B
5          B
6          A

Я использовал коррелированный подзапрос, чтобы найти предыдущее значение поля pkey_field для каждой строки.

SELECT
    m.pkey_field,
    m.target,
    (SELECT Max(pkey_field)
        FROM YourTable
        WHERE pkey_field < m.pkey_field)
    AS prev_pkey_field
FROM YourTable AS m;

Затем поместите это в подзапрос, который я присоединил к другой копии базовой таблицы.

SELECT
    sub.pkey_field,
    sub.target,
    sub.prev_pkey_field,
    prev.target AS prev_target
FROM
    (SELECT
        m.pkey_field,
        m.target,
        (SELECT Max(pkey_field)
            FROM YourTable
            WHERE pkey_field < m.pkey_field)
        AS prev_pkey_field
    FROM YourTable AS m) AS sub
    LEFT JOIN YourTable AS prev
    ON sub.prev_pkey_field = prev.pkey_field
WHERE
    sub.prev_pkey_field Is Null
    OR prev.target <> sub.target;

Это результат последнего запроса.

pkey_field target prev_pkey_field prev_target
1          A  
4          B      3               A
6          A      5               B
0 голосов
/ 08 февраля 2012

Вот первая попытка,

SELECT t1.Row, t1.target
FROM t1 WHERE (((t1.target)<>NZ((SELECT TOP 1  t2.target FROM t1 AS t2 WHERE t2.DateTimeId<t1.DateTimeId ORDER BY t2.DateTimeId DESC),"X")));
...