来自给定值的SQL,获取所有顶行和底行,直到此值更改为止

时间:2015-08-13 16:47:33

标签: sql vb.net

我有一个本地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

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