如何在 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 字段中添加日期标准,如果您需要,例如。每个客户端或每天的登录次数,您需要将ClientCAST(Date) AS DATE 字段添加到SELECTGROUP 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 中循环访问多个登录条目并计算登录次数和时间?的主要内容,如果未能解决你的问题,请参考以下文章

将来自http API的多个数据返回插入sql lite

SQL Server 2005 中的水平到垂直表转换

如何在SQL 2005中实现循环每一行做一定的操作

如何从 tsql (sql 2005) 中的 utc 日期时间计算本地日期时间?

如何在 MS SQL 2005 中使用 SQL XQuery 修改多个节点

从列表条目访问 SQL 数据