SQLite 查询;按小时和按设备分组

I A*_*DBA 3 sql sqlite select

我有一个计数器和计数的 SQLite 数据库,如下所示:

       DateTime        |Gate|Count
-----------------------+----+-----
2015-09-23T19:23:01.000|   2|  345
2015-09-23T19:41:08.000|   2|  346
2015-09-23T19:41:30.000|   3|  654
2015-09-23T19:44:00.000|   4|  556
2015-09-23T21:13:47.000|   2|  348
Run Code Online (Sandbox Code Playgroud)

我想确定每个门每小时计数的数量。在上表中,2 号门在 19:00 时计数为 1,在 21:00 时计数为 2。

我设法得到以下选择语句:

SELECT  strftime('%Y-%m-%dT%H:00:00.000', DateTime),
          max(Count) - min(Count) 
FROM GateTbl 
WHERE Gate='2' 
GROUP by strftime('%Y-%m-%dT%H:00:00.000', DateTime);
Run Code Online (Sandbox Code Playgroud)

起初似乎我走在正确的轨道上,因为这几乎完成了我想要的。但它一次只适用于一个门,当我想返回所有门的每小时计数时。我也开始意识到它在上面的 21:00 之类的时间里不起作用,那个小时只有一个条目。

我看不到在 SQL 语句中执行此操作的方法,我希望这里有人可以。任何帮助表示赞赏。

Gor*_*off 5

您只需要添加Gategroup byand select

SELECT gate, strftime('%Y-%m-%dT%H:00:00.000', DateTime),
       max(Count) - min(Count) 
FROM GateTbl 
GROUP by gate, strftime('%Y-%m-%dT%H:00:00.000', DateTime);
Run Code Online (Sandbox Code Playgroud)

编辑:

哎呀,对不起。你真正需要的是下一个小时的第一次计数。SQL对此有一个很好的功能,lag(). 但不是 SQLite。但是,您可以使用相关子查询来实现:

WITH gh as (
      SELECT gate, strftime('%Y-%m-%dT%H:00:00.000', DateTime) as dt,
             MIN(Count) as mincount, MAX(count) as maxcount
      FROM GateTbl 
      GROUP by gate, strftime('%Y-%m-%dT%H:00:00.000', DateTime)
     )
SELECT gh.gate, gh.dt,
       COALESCE(gh.next_mincount, gh.maxcount) - gh.mincount
FROM (SELECT gh.*,
             (SELECT gh2.mincount
              FROM gh gh2
              WHERE gh2.gate = gh.gate AND gh2.dt > gh.dt
              ORDER BY gh2.dt
              LIMIT 1
             ) as next_mincount
      FROM gh
     ) gh;
Run Code Online (Sandbox Code Playgroud)

coalesce()只是最后一个小时。这将使用该小时内的最后一个时间戳。如果只有一个,那么那一小时你会得到 0。