SQL查询日期时间列表的累积频率
我在数据库列中有一个时间列表(代表对网站的访问)。
我需要将它们按时间间隔分组,然后获得这些日期的“累积频率”表。
例如,我可能有:
9:01
9:04
9:11
9:13
9:22
9:24
9:28
我想将其转换为
9:05 - 2
9:15 - 4
9:25 - 6
9:30 - 7
我该怎么做? 我可以用 SQL 轻松实现这一点吗? 我可以很容易地用 C# 做到这一点
I have a list of times in a database column (representing visits to a website).
I need to group them in intervals and then get a 'cumulative frequency' table of those dates.
For instance I might have:
9:01
9:04
9:11
9:13
9:22
9:24
9:28
and i want to convert that into
9:05 - 2
9:15 - 4
9:25 - 6
9:30 - 7
How can I do that? Can i even easily achieve this in SQL? I can quite easily do it in C#
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
结果是:
Results in:
我应该指出,根据问题的陈述“意图”,对访客流量进行分析 - 我写了这个声明来总结统一组中的计数。
否则(如在“示例”组中)将比较 5 分钟间隔内的计数与 10 分钟间隔内的计数 - 这是没有意义的。
您必须理解用户需求的“意图”,而不是字面上的“阅读”。 :-)
I should point out that based on the stated "intent" of the problem, to do analysis on visitor traffic - I wrote this statement to summarize the counts in uniform groups.
To do otherwise (as in the "example" groups) would be comparing the counts during a 5 minute interval to counts in a 10 minute interval - which doesn't make sense.
You have to grok to the "intent" of the user requirement, not the literal "reading" of it. :-)
哦,所有这些东西太复杂了。
标准化为秒,除以您的存储桶间隔,截断并重新相乘:
使用 Ron Savage 的数据,我知道
您可能希望使用 ceil() 或 round() 而不是 Floor()。
更新:对于使用以下命令创建的表
ooh, way too complicated all of that stuff.
Normalise to seconds, divide by your bucket interval, truncate and remultiply:
Using Ron Savage's data, I get
You may wish to use ceil() or round() instead of floor().
Update: for a table created with
创建一个表
periods
来描述您希望将一天划分为的时间段。Create a table
periods
describing the periods you wish to divide the day up into.创建一个表,其中包含您想要获取总计的时间间隔,然后将两个表连接在一起。
例如:
如果您想要的不是累计总计,而是某个范围内的总计,那么您可以向 time_interval 表添加一个 time_start 列,并将查询更改为
Create a table containing what intervals you want to be getting totals at then join the two tables together.
Such as:
If instead of wanting cumulative totals you wanted totals within a range, then you add a time_start column to the time_interval table and change the query to
这使用了相当多的 SQL 技巧 (SQL Server 2005):
请注意,它将所有时间放在同一天,并假设它们位于日期时间列中。 它唯一没有像您的示例那样执行的操作是从时间表示中删除前导零。
This uses quite a few SQL tricks (SQL Server 2005):
Note that it puts all the times on the same day, and assumes they are in a datetime column. The only thing it doesn't do as your example does is strip the leading zeroes from the time representation.