我有一个计数器和计数的 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 语句中执行此操作的方法,我希望这里有人可以。任何帮助表示赞赏。
您只需要添加Gate到group 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。
| 归档时间: |
|
| 查看次数: |
5128 次 |
| 最近记录: |