使用distinct查询用户登录并报告每日,每周和每月使用情况

时间:2013-07-20 22:43:19

标签: sql-server

我有一个SQL查询,我希望每小时,每天,每周和每月报告网站使用情况。

我要求查询使用Distinct,因为每次新登录网站时,应用程序的性质都会为表创建几个条目。

这是我到目前为止所做的:

SELECT  DISTINCT OPRID, 
CONVERT(varchar(12), LOGINDTTM, 112) 'Date'
from   PSACCESSLOG_HIST
where  OPRID NOT IN ('AUTOPROC', 'PSAPPS', 'PHSADBA', 'PTWEBSERVER')
ORDER BY Date

这将提供以下内容:

OPRID     LOGIPADDRESS     LOGINDTTM      LOGOUTDTTM
dadams     10.1.1.5        20130612        20130612
jblake     10.1.1.5        20130614        20130614

首先,我需要按天将上述数据分组。这就是我正在寻找的部分:

LOGINDATE-TIME    TOTAL-LOGINS
20130612           25
20130613           35
20130614           45

2 个答案:

答案 0 :(得分:0)

SELECT CONVERT(varchar(12), LOGINDTTM, 112) 'Date', count(*) as TOTAL-LOGINS
from PSACCESSLOG_HIST
where OPRID NOT IN ('AUTOPROC', 'PSAPPS', 'PHSADBA', 'PTWEBSERVER')
GROUP BY Date
ORDER BY Date

答案 1 :(得分:0)

我不清楚您的查询如何产生您生成的表格。您的查询未提及logoutdttm。在任何情况下,您都可以通过按日期分组并在每个日期计算不同的“OPRID”(如果我理解您的请求正确)来执行您想要的操作:

SELECT  CONVERT(varchar(12), LOGINDTTM, 112) as "Date", count(distinct OPRID) as NumOPRs
from   PSACCESSLOG_HIST
where  OPRID NOT IN ('AUTOPROC', 'PSAPPS', 'PHSADBA', 'PTWEBSERVER')
group by CONVERT(varchar(12), LOGINDTTM, 112)
ORDER BY Date

(作为旁注,SQL Server不允许您在group by列中使用别名。)

我更喜欢将日期时间转换为convert()数据类型,而不是date

SELECT  cast(LOGINDTTM as date) as "Date", count(distinct OPRID) as NumOPRs
from   PSACCESSLOG_HIST
where  OPRID NOT IN ('AUTOPROC', 'PSAPPS', 'PHSADBA', 'PTWEBSERVER')
group by cast(LOGINDTTM as date)
ORDER BY "Date"

此外,尽管SQL Server可能允许您将列的别名放在单引号中,但您应该使用双引号或方括号。单引号在SQL语句中具有强烈的意义,而不是列或表的名称。