sql - 按日期与空组分组

标签 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 Logins  
    FROM LoginAudit 
GROUP BY DATEADD(day, DATEDIFF(day,0,LoginAudit.LoginDateTime), 0)
ORDER BY 1  

最佳答案

本质上,您要问的是将您的表格连接到日期“表格”。日期表将没有间隙,您将根据日期值进行分组。那么如何创建日期表呢?

SQL for Smarties ,建议您保留一个整数表,以备不时之需,以备不时之需。然后,您可以通过将表格加入其中来选择所需的任何序列。

因此,如果您有一个整数表,其中的值根据需要从 NOW() 返回尽可能多的天数,您可以执行以下操作:

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;

预计到达时间,用于 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;

关于sql - 按日期与空组分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1478125/

相关文章:

sql - 为什么来自 VIEW 的 SELECT * 比来自同一个 VIEW 的 SELECT(特定列)执行得更快?

mysql - SQL 通过限定多个字符串进行选择

sql-server - 相当于 oracle 的 T-SQL 显示所有

sql - 如何获取表的每日快照

sql - 更改表中的 2 列 - 有风险的操作吗?

sql - 在 SQL View 中将地址列拆分为单独的列

java - 将日期发送到 postgresql

mysql - 非常大的表的 SQL 分区

mysql - 从 mySQL 5.5 到 SQL Server 2005 的语法更改

使用嵌套 Case 语句的 SQL 行到列