sql - 使用递归公用表表达式(如 while 循环)

标签 sql t-sql sql-server-2008 common-table-expression recursive-cte

我有下表

   Log

 Date            date
 Description     varchar
 ID              integer

给定一个日期作为参数,我必须找到编号。或从开始日期到其后一个月使用递归 cte 每天记录的日志计数。 有些天可能没有任何日志,所以我必须将计数打印为 0。

例如:

  select * from Log

返回

  1   insert      2011-01-17
  2   blah blah   2011-01-23
  3   blah        2011-07-07

对于 2011-01-17 作为输入,输出应该是

   2011-01-17    1
   2011-01-18    0
   2011-01-19    0
   ....
   2011-01-23    1
   .....
   2011-02-17    0

我必须使用递归cte来做到这一点。我不知道如何在每次递归中将日期加1以及如何停止\终止递归。

这是我迄今为止所做的事情:

 with cte as    (
    select '2011-01-17' as dat,count(*) as count 
from log group by date 
having date='2011-01-17' 

union all 

select dateadd(day,1,dat) as dat,count(*) as count 
from log,cte 
group by date 
having date=dateadd(day,1,dat) 
where dat<'2011-02-17' 
) 
select * from cte

最佳答案

WITH    days (d, maxd) AS
        (
        SELECT  MIN(date), MAX(date)
        FROM    log
        UNION ALL
        SELECT  DATEADD(day, 1, d), maxd
        FROM    days
        WHERE   d < maxd
        )
SELECT  d, COUNT(id)
FROM    days
LEFT JOIN
        log l
ON      l.date = d
GROUP BY
        d

关于sql - 使用递归公用表表达式(如 while 循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6692233/

相关文章:

sql - 以下两个查询会一致地给出相同的输出吗?

Azure Synapse SQL 池未使用 OPENROWSET 识别 csv header

sql - 获取今天午夜的日期和时间并添加到其中

sql - 如何在SQL Server中的两个SELECT语句之间执行LEFT JOIN?

mysql - 如果查询在 MySql 中返回空值,我如何设置 0?

mysql - 高级(可能不是?)MYSQL查询select语句

sql - 如何优化这个查询?

sql - 从表中选择最大日期

sql-server - 重写T-SQL按位逻辑

sql - 将表中的所有列设置为 `null`