2015-01-17 74 views
-1

我已经跟踪车辆数据,我想创建车辆停车报告。帮我写这个sql查询。实际数据和结果数据分别如表1和表2所示。Sql Table按值分组

enter image description here enter image description here

谢谢!

+0

我不是在写SQL查询好,我已经尽力了,但没有成功。 – cherisys

+0

你使用哪个版本的sql? SELECT @@ VERSION –

+0

Microsoft SQL Server 2008(RTM) - 10.0.1600.22(X64)Jul 9 2008 14:17:44 Copyright(c)1988-2008 Windows NT 6.0上的Microsoft Corporation Enterprise Edition(64位)(Build 6002:Service Pack 2) – cherisys

回答

0

好,这里是一些工作陈述

declare @t TABLE(id INT, dt DATETIME, sp int) 

INSERT INTO @t VALUES(1, '2015-01-17 12:00:05', 12) 
INSERT INTO @t VALUES(1, '2015-01-17 12:00:06', 0) 
INSERT INTO @t VALUES(1, '2015-01-17 12:00:07', 0) 
INSERT INTO @t VALUES(1, '2015-01-17 12:00:08', 0) 
INSERT INTO @t VALUES(1, '2015-01-17 12:00:09', 5) 
INSERT INTO @t VALUES(1, '2015-01-17 12:00:10', 8) 
INSERT INTO @t VALUES(1, '2015-01-17 12:00:11', 0) 
INSERT INTO @t VALUES(1, '2015-01-17 12:00:12', 0) 
INSERT INTO @t VALUES(1, '2015-01-17 12:00:13', 0) 
INSERT INTO @t VALUES(1, '2015-01-17 12:00:14', 7) 
INSERT INTO @t VALUES(2, '2015-01-17 12:00:05', 10) 
INSERT INTO @t VALUES(2, '2015-01-17 12:00:06', 0) 
INSERT INTO @t VALUES(2, '2015-01-17 12:00:07', 0) 
INSERT INTO @t VALUES(2, '2015-01-17 12:00:08', 0) 
INSERT INTO @t VALUES(2, '2015-01-17 12:00:09', 12) 
INSERT INTO @t VALUES(2, '2015-01-17 12:00:10', 0) 
INSERT INTO @t VALUES(2, '2015-01-17 12:00:11', 0) 
INSERT INTO @t VALUES(2, '2015-01-17 12:00:12', 10) 




; 
WITH cte1 
      AS (SELECT a.id , 
         a.dt AS stdt , 
         b.dt AS endt , 
         a.sp , 
         a.rn 
       FROM  (SELECT * , 
            1 
            + ROW_NUMBER() OVER (PARTITION BY id ORDER BY dt) AS n , 
            ROW_NUMBER() OVER (ORDER BY GETDATE()) AS rn 
          FROM  @t t1 
         ) a 
         LEFT JOIN (SELECT * , 
              ROW_NUMBER() OVER (PARTITION BY id ORDER BY dt) AS n 
            FROM @t t1 
           ) b ON b.id = a.id 
             AND b.n = a.n 
      ), 
     cte2 
      AS (SELECT t1.id , 
         t1.stdt , 
         ISNULL(t1.endt, GETDATE()) AS endt , 
         t1.sp , 
         t1.rn , 
         SUM(t2.sp) AS sum 
       FROM  cte1 t1 
         INNER JOIN cte1 t2 ON t1.rn >= t2.rn 
       GROUP BY t1.id , 
         t1.stdt , 
         t1.endt , 
         t1.sp , 
         t1.rn 
      ) 
    SELECT id , 
      MIN(stdt) , 
      MAX(stdt) , 
      DATEDIFF(ss, MIN(stdt), MAX(stdt)) 
    FROM cte2 
    WHERE sp = 0 
    GROUP BY id , 
      SUM 

下面是结果

1 2015-01-17 12:00:06.000 2015-01-17 12:00:08.000 2 
1 2015-01-17 12:00:11.000 2015-01-17 12:00:13.000 2 
2 2015-01-17 12:00:06.000 2015-01-17 12:00:08.000 2 
2 2015-01-17 12:00:10.000 2015-01-17 12:00:11.000 1 

您有车辆1 12:06 to 12:08结果。但我真的认为结果应该是。如果是这样,只是改变

SELECT id , 
       MIN(stdt) , 
       MAX(stdt) , 
       DATEDIFF(ss, MIN(stdt), MAX(stdt)) 
     FROM cte2 
     WHERE sp = 0 
     GROUP BY id , 
       SUM 

SELECT id , 
      MIN(stdt) , 
      MAX(endt) , 
      DATEDIFF(ss, MIN(stdt), MAX(endt)) 
    FROM cte2 
    WHERE sp = 0 
    GROUP BY id , 
      SUM 
+0

非常感谢你兄弟。 – cherisys

+0

我的另一个问题是,如果你能帮我解决问题......我在每天都会产生大量新记录的大型数据表上使用这个查询。在这一点上,查询的响应时间在几分钟内非常高。 是否可以进行任何优化,以便将响应时间缩短至不到一分钟? 感谢和问候 – cherisys