在已排序的MS Access查询中查找连续区域

时间:2012-02-08 03:07:57

标签: sql ms-access ms-access-2007

我是Stack Overflow的长期粉丝,但我遇到了一个我尚未找到解决的问题,需要一些专家帮助。 我有一个按时间顺序排序的查询,其中包含日期时间复合键(唯一,永不删除)和几个数据。我想知道的是,是否有办法找到值发生变化的区域的开始(或结束)?即。

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

  7. 并且我的查询返回第1,4和6行。它找到col 5中从A到B然后从B返回到A的变化?我已经尝试了find duplicates方法并在totalals属性中使用min和max但是它给了我第一个和最后一个而不是local max和min?有类似的问题吗?

2 个答案:

答案 0 :(得分:1)

我没有看到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

答案 1 :(得分:0)

这是第一次尝试,

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")));