我有一个本地SQL Express,我正在从vb.net做一些查询。然而,跟随一个没有成功。如果我有类似的东西,
dateTime var1
2015/08/10 18:35:00 1
2015/08/10 18:36:00 1
2015/08/10 18:37:20 2
2015/08/10 18:38:00 2
2015/08/10 18:39:00 2
2015/08/10 18:40:00 2
2015/08/10 18:39:20 1
2015/08/10 18:40:00 2
从已知的dateTime和var1,我想得到所有的顶行和底行,直到var1改变。 例如,从“2015/08/10 18:38:00”,“2”我应该得到,
2015/08/10 18:37:20 2
2015/08/10 18:38:00 2
2015/08/10 18:39:00 2
2015/08/10 18:40:00 2
答案 0 :(得分:2)
下一个查询选择固定值的边界,然后选择它们之间的所有行:
SELECT * FROM Test
WHERE id < (
SELECT IFNULL((SELECT a.id FROM Test a, Test b, Test c
WHERE
(a.id = b.id + 1 AND a.var != b.var)
AND
c.id < a.id
AND
c.date = '2015/08/10 18:38:00'
AND
c.var = 2
ORDER BY a.id LIMIT 1), (SELECT MAX(id) + 1 FROM Test))
) AND id > (
SELECT IFNULL((SELECT a.id FROM Test a, Test b, Test c
WHERE
(a.id = b.id - 1 AND a.var != b.var)
AND
c.id > a.id
AND
c.date = '2015/08/10 18:38:00'
AND
c.var = 2
ORDER BY a.id DESC LIMIT 1), (SELECT MIN(id) - 1 FROM Test))
);
我希望它能解决你的问题。
答案 1 :(得分:1)
我很确定有更优雅的方法可以实现这一目标,但我会尽力而为:这假设您正在寻找一条Var1
值不间断的链,每分钟至少有一条记录。
我无法弄清楚的一件事是如何基于一分钟间隙理论在两个方向(低和高)爬行,所以我使用一对递归CTE
然后{两者都是{1}}。
SELECT