计算时间列的模式

时间:2014-03-03 09:02:53

标签: sql sqlite

我正在创建一个多租户应用程序,对于特定事件,当用户触发时,我将事件开始时间保存在数据库中(SQLite)。为了确定峰值请求时间,我试图找到保存的时间戳的mode。不要与平均值相混淆,平均值将给出我所有时间戳的平均值 - 我正在寻找一种方法来找到反映峰值的结果范围。例如 - 下午2点至下午4点之间,大多数事件都被解雇了。时间戳以YYYY-MM-DDTHH:NN:SS格式存储为字符串值。

我在写下一个有助于解决此问题的查询时遇到了问题。

3 个答案:

答案 0 :(得分:1)

算法应如下:

  1. 选择范围的持续时间,例如1小时或2小时
  2. 对于每个时间戳,确定它属于哪个范围。例如,如果您选择了1小时范围且时间戳是下午5:09,那么它属于下午5:00 - 下午6:00范围。
  3. 按范围分组并计算每个时间范围内的时间戳数。
  4. 选择最长时间范围
  5. 以下是一个示例查询,使用该查询可以在范围持续时间为1小时时完成时间戳的查找模式:

    SELECT Range AS RangeStart, Range+1 AS RangeEnd FROM
    (
       SELECT STRFTIME('%H',starttime) AS Range, COUNT(*) As cnt FROM Events
       GROUP BY STRFTIME('%H',starttime)
    )
    ORDER BY cnt DESC 
    LIMIT 1;
    

    您可以在SQL Fiddle

    查看代码

    如果它解决了您的问题,请告诉我。

答案 1 :(得分:1)

SQLite中,您可以使用类似此查询的内容来获得DATETIME的中位数:

SELECT DATETIME(CAST(AVG(CAST(strftime("%s",T) as int)) AS TEXT),'unixepoch') median FROM
(SELECT TEST T FROM TABLE1 ORDER BY TEST
LIMIT 2 - (SELECT COUNT(*) FROM TABLE1) % 2
OFFSET ((SELECT COUNT(*) FROM TABLE1) / 2) - 
       (1 - (SELECT COUNT(*) FROM TABLE1) % 2))T2;

SQL Fiddle

答案 2 :(得分:1)

这是我为解决问题所做的工作: -

  1. 我创建了另一个列,它只存储了时间戳的小时。

  2. 执行以下查询。

    SELECT EventHour,COUNT(*)AS CountOfHours FROM EventTable GROUP BY EventHour 订购CountOfHours DESC 限制1

  3. 这给出了事件的峰值交通时间范围