Sql 使用空组按日期分组
我有一个loginAudit表,我正在尝试获取每天所有登录的计数。我想做的是让没有登录的日子返回他们的日子,并且登录计数为0。目前,在没有登录的天数内没有返回任何行 这可能是不可能的,并且在返回查询结果后必须在应用程序中填写空组Sql 使用空组按日期分组,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我有一个loginAudit表,我正在尝试获取每天所有登录的计数。我想做的是让没有登录的日子返回他们的日子,并且登录计数为0。目前,在没有登录的天数内没有返回任何行 这可能是不可能的,并且在返回查询结果后必须在应用程序中填写空组 SELECT DATEADD(day, DATEDIFF(day,0,LoginAudit.LoginDateTime), 0) as LoginDate, COUNT(DISTINCT LoginAudit.LoginAuditID) AS
SELECT DATEADD(day, DATEDIFF(day,0,LoginAudit.LoginDateTime), 0) as LoginDate,
COUNT(DISTINCT LoginAudit.LoginAuditID) AS Logins
FROM LoginAudit
GROUP BY DATEADD(day, DATEDIFF(day,0,LoginAudit.LoginDateTime), 0)
ORDER BY 1
您使用的是什么数据库管理系统 如果是Oracle,您可以尝试在子查询中选择日期,如下所示:
SELECT TRUNC(SYSDATE) + 1 - LEVEL AS today,
TRUNC(SYSDATE) + 2 - LEVEL AS tomorrow
FROM DUAL
CONNECT BY LEVEL <= 30 /* Last 30 days */
那么你可以做:
SELECT today as LoginDate,
COUNT(DISTINCT LoginAudit.LoginAuditID) AS Logins
FROM (
SELECT TRUNC(SYSDATE) + 1 - LEVEL AS today,
TRUNC(SYSDATE) + 2 - LEVEL AS tomorrow
FROM DUAL
CONNECT BY LEVEL <= 30 /* Last 30 days */
),
LoginAudit
WHERE LoginAudit.LoginDateTime BETWEEN today AND tomorrow
GROUP BY today
ORDER BY 1
我认为我已经相当彻底地搜索了解决方案,但在发布问题后,我发现了以下链接:
哇 本质上,您所要求的是将您的表加入到日期表中。日期表将没有间隙,您将根据日期值分组。那么如何创建日期表呢 在中,建议在需要连接无间隙序列的情况下保留一个整数表。然后,您可以通过将表连接到它来选择所需的任何序列 因此,如果您有一个整型表,其中的值可以根据需要追溯到几天之后,您可以执行以下操作:
SELECT DATE_SUB(CURDATE(), INTERVAL i.intvalue DAY) AS thedate,
COUNT(DISTINCT LoginAudit.LoginAuditID) AS logins
FROM i LEFT JOIN dual ON (DATE_SUB(NOW(), INTERVAL i.intvalue DAY)= day)
GROUP BY DATE_SUB(CURDATE(), INTERVAL i.intvalue DAY)
ORDER BY i DESC;
ETA,对于mysql:
//创建一个整数表
create table i(i integer not null primary key);
insert into i values (0),(1),(2) ... (9);
如果我需要0-99个连续数字:
SELECT 10*t.i + u.i AS number
FROM i AS u
CROSS JOIN
i AS t
ORDER BY number;
如果我需要连续日期:
SELECT date_sub(curdate(), interval (10*t.i + u.i) DAY) as thedate
FROM i AS u
CROSS JOIN
i AS t
ORDER BY thedate;
不幸的是,使用MS SQL Server 2005。谢谢你@琼:是的。但尝试是最容易找到答案的方法。我尝试了,但无法让它工作。。。Mysql似乎在术语双重上失败了。选择日期,INTERVAL ints.id DAY作为日期,COUNTDISTINCT winners.id作为winners FROM ints LEFT JOIN dual ON DATE,INTERVAL ints.id DAY=按日期分组,INTERVAL ints.id DAY ORDER BY ints DESC@乔:很抱歉。这篇文章很旧,我几乎总是使用MySQL。你知道我如何让它在我上面发布的查询中工作吗?否则我会把它变成一个新问题:@joon:在我的答案中添加了一些MySQL让你开始。