【问题标题】:SQLite query; Group By Hour And By DeviceSQLite 查询;按小时和按设备分组
【发布时间】:2015-12-24 11:45:00
【问题描述】:

我有一个计数器和计数的 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

我想确定每个门每小时计数的数量。在上表中,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);

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

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

【问题讨论】:

  • But it only works for one gate at a time。是的。这就是WHERE Gate='2' 的意思。

标签: sql sqlite select


【解决方案1】:

您只需将Gate 添加到group by 和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);

编辑:

糟糕,抱歉。您真正需要的是从 next 小时开始的第一个计数。 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;

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

【讨论】:

  • 这非常有帮助。谢谢!但如果一个小时内只有一个条目,它并没有解决第二个问题,即正确计数。在示例表中,Gate 2 在 21:00 时的计数应为 2,但返回 0。
  • @IAmNotADBA 。 . .这样做的关键是从 next 小时开始计数。这意味着您的每小时计数应该正确汇总 - 也就是说,所有内容都将被计算在内。缺点是行之间的一些值将在第一个小时计算,而实际上它们可能在第二个小时内发生,但这是数据结构中固有的危险。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多