2015-08-13 23 views
0

我有一個本地SQL Express,我正在做一些來自vb.net的查詢。然而,跟隨一個沒有成功。如果我有從已知datetime和VAR1類似,來自給定值的SQL,獲取所有頂部和底部行,直到該值發生變化

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 

,我想獲得所有的頂部和底部行,直到VAR1變化。 例如,從「2015年8月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

你想在SQL中執行此操作還是在VB.Net中執行此操作? –

+0

我在VB編程,但我要求的SQL字符串 – Jaume

+0

它是在數據庫還是在datagridview?或者目前的數據在哪裏? –

回答

1

我敢肯定,有實現這一點有更優雅的方式,但我會請盡我所能:假設您正在尋找一個不間斷的Var1值鏈,每分鐘至少有一條記錄。

我無法弄清楚的一件事是如何基於一分鐘間隙理論在兩個方向(低和高)進行抓取,所以我使用了一對遞歸CTE,然後使用了兩對SELECT

DECLARE @DateTime DATETIME = '2015/08/10 18:38:00' 
DECLARE @Var1 INT = 2 

;WITH 
    Data AS 
     (
     SELECT '2015/08/10 18:35:00' AS D, 1 AS V UNION ALL 
     SELECT '2015/08/10 18:36:00' AS D, 1 AS V UNION ALL 
     SELECT '2015/08/10 18:37:20' AS D, 2 AS V UNION ALL 
     SELECT '2015/08/10 18:38:00' AS D, 2 AS V UNION ALL 
     SELECT '2015/08/10 18:39:00' AS D, 2 AS V UNION ALL 
     SELECT '2015/08/10 18:40:00' AS D, 2 AS V UNION ALL 
     SELECT '2015/08/10 18:39:20' AS D, 1 AS V UNION ALL 
     SELECT '2015/08/10 18:40:00' AS D, 2 AS V 
    ), 
    Low AS 
     (
     SELECT D, V 
     FROM Data 
     WHERE D = @DateTime AND V = @Var1 

     UNION ALL 

     SELECT Data.D, Data.V 
     FROM 
      Data 
      INNER JOIN 
      Low ON 
       DATEDIFF(MINUTE, Data.D, Low.D) = 1 AND 
       Data.V = Low.V 
    ), 
    High AS 
     (
     SELECT D, V 
     FROM Data 
     WHERE D = @DateTime AND V = @Var1 

     UNION ALL 

     SELECT Data.D, Data.V 
     FROM 
      Data 
      INNER JOIN 
      High ON 
       DATEDIFF(MINUTE, Data.D, High.D) = -1 AND 
       Data.V = High.V 
    ) 


SELECT * 
FROM Low 

UNION 

SELECT * 
FROM High 
OPTION (MAXRECURSION 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)) 
); 

我希望它可以解決你的問題。