我是Stack Overflow的长期粉丝,但我遇到了一个我尚未找到解决的问题,需要一些专家帮助。 我有一个按时间顺序排序的查询,其中包含日期时间复合键(唯一,永不删除)和几个数据。我想知道的是,是否有办法找到值发生变化的区域的开始(或结束)?即。
DateTime someVal1 someVal2 someVal3 target
并且我的查询返回第1,4和6行。它找到col 5中从A到B然后从B返回到A的变化?我已经尝试了find duplicates方法并在totalals属性中使用min和max但是它给了我第一个和最后一个而不是local max和min?有类似的问题吗?
答案 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")));