如何在 SQL 2005 中循环访问多个登录条目并计算登录次数和时间?
Posted
技术标签:
【中文标题】如何在 SQL 2005 中循环访问多个登录条目并计算登录次数和时间?【英文标题】:How to loop through multiple login entries and calculate the Login Count and time in SQL 2005? 【发布时间】:2010-11-16 04:19:37 【问题描述】:我是 SQL 的初学者,希望大家能帮助我度过这个难关。
以下数据应按客户、日期和用户 ID 分组(我已经实现了)。
Client User ID Date Action Module
Moha Mother 01/10/2010 12:35:36 PM Login PP
Moha Voodoo 02/10/2010 05:15:28 PM Login PP
Moha Panther 04/10/2010 04:36:42 PM Login PP
Moha Mother 01/10/2010 12:42:35 PM Some Action PP
Moha Mother 01/10/2010 12:55:14 PM Some Action PP
Moha Voodoo 02/10/2010 06:35:46 PM Login PP
Moha Panther 04/10/2010 04:53:24 PM Some Action PP
Moha Deuce 05/10/2010 09:13:42 PM Login PP
Moha Deuce 05/10/2010 09:19:42 PM Some Action PP
Moha Panther 06/10/2010 08:11:22 PM Login PP
Moha Deuce 05/10/2010 09:27:49 PM Some Action PP
Moha Panther 06/10/2010 08:15:18 PM Some Action PP
Moha Panther 06/10/2010 08:44:53 PM Some Action PP
Moha Deuce 05/10/2010 09:27:49 PM Login PP
Moha Rabbit 05/20/2010 09:27:49 PM Login PP
Moha Voodoo 02/10/2010 06:57:35 PM Some Action PP
Moha Deuce 06/10/2010 08:30:59 AM Login PP
Moha Rabbit 05/21/2010 09:27:49 PM Login PP
Moha Mother 03/10/2010 01:04:54 PM Login PP
Moha Mother 03/10/2010 01:23:55 PM Some Action PP
Moha Mother 03/10/2010 02:25:46 PM Login PP
Moha Mother 03/10/2010 02:45:54 PM Some Action PP
完成后,我想知道以下信息是否可以通过 SQL 获得。
客户用户 ID 日期 登录次数 登录时间(分钟) Moha Mother 01/10/2010 1 19.6 (00:06:59 + 00:12:39) - 不需要括号信息 莫哈母亲 03/10/2010 2 39.2 (00:19:01 + 00:20:08) 莫哈巫毒………… 莫哈………………
我已经编写了一个程序,它将动态接受客户端、开始日期、结束日期和用户 ID 的可选参数。我的程序将首先将日期转换为 varchar 格式并仅提取日期以进行分组,然后使用 case 语句计算登录次数。但..!!您如何计算 2 个连续条目之间的时间差并获得符合分组规则的登录计数?是否可以使用游标实现相同的目标?
请随时就上述主题提出任何问题并提出任何建议,因为这是我的关键要求之一。先谢谢大家了。
谢谢 计算机科学
【问题讨论】:
行有点乱码。请在文本板或 Excel 表中设置相同格式以查看行。很抱歉给您带来不便。 可以选择需要格式化的行CTRL+K 【参考方案1】:这个问题有多种解决方案。
首先,我必须说我不能给你一个完整的解决这个问题的方法。登录计数是一件容易的事,但对于每个用户的登录持续时间,我需要更多信息。根据目前的数据,不清楚哪个日期表示注销时间。假设这是在新登录之前最后一次出现“某些操作”,那么解决方案是可能的,但我不知道这个假设是否正确。如果用户并行打开多个会话,则此假设将被打破,并且如果未记录注销时间(例如,当会话在某个时间点后超时并且未存储时间时),您无能为力。
无论如何,我想说三点:
基于集合的查询与游标的一般参数 建议的登录计数查询 有关如何在登录期间继续操作的提示第一点:您建议使用游标和存储过程来确定登录计数。这个解决方案可以工作,但它通常是您使用普通编程语言(例如 C 或 Pascal)进行的方式:在数据上定义一个 for 循环并为每一行执行计算或例程。在 SQL 中,通常建议以不同的方式思考。仅在确实需要时使用游标和循环,否则使用基于集合的解决方案。原因是基于集合的查询更容易为 SQL 解释器优化。这个论点在其他地方的几篇文章中令人信服地提出,例如这里:Why are relational set-based queries better than cursors?
那么如何以“基于集合”的方式进行?从登录计数开始,您可以执行以下操作:
SELECT user, COUNT(*)
FROM YourTable
WHERE Action = 'Login'
GROUP BY user
这将返回每个用户的登录次数。如果您想要某个时间段内的登录次数,您可以在WHERE
字段中添加日期标准,如果您需要,例如。每个客户端或每天的登录次数,您需要将Client
或CAST(Date) AS DATE
字段添加到SELECT
和GROUP BY
子句。
最后关于登录时长,您的问题是如何计算两个连续条目之间的时间差,这确实应该这样做。在 MSSQL 中,我会使用 ROW_NUMBER()
来做到这一点(尽管对于您的特定情况可能有更好的解决方案):
WITH NumberedTable AS (
SELECT User, Date, ROW_NUMBER() OVER (PARTITION BY User ORDER BY Date) AS LoginOccurrenceSortedByDate
FROM YourTable
WHERE Action = 'Login'
)
SELECT L.User, L.Date, DATEDIFF(seconds, R.Date, L.Date) AS DifferenceWithPreviousLogin
FROM NumberedTable L
LEFT JOIN NumberedTable R
ON R.LoginOccurrenceSortedByDate = L.LoginOccurrenceSortedByDate - 1
你基本上LEFT JOIN
每个条目都与前一次出现并计算时间差。
【讨论】:
以上是关于如何在 SQL 2005 中循环访问多个登录条目并计算登录次数和时间?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 tsql (sql 2005) 中的 utc 日期时间计算本地日期时间?