SQL通过滑动窗口保持事件计数

SQL通过滑动窗口保持事件计数,sql,sql-server,count,sql-server-2012,Sql,Sql Server,Count,Sql Server 2012,在上一个问题(请参考:)中,我需要计算变量的出现次数 提供的代码如下: SELECT [Date], Code, [Count] = COUNT(*) OVER (PARTITION BY Code ORDER BY [Date] ROWS UNBOUNDED PRECEDING) FROM dbo.YourTable ORDER BY [Date]; 但是,现在我需要对该代码进行改进: 假设我有下表: Date | Code --------

在上一个问题(请参考:)中,我需要计算变量的出现次数

提供的代码如下:

SELECT 
    [Date], Code, 
    [Count] = COUNT(*) OVER (PARTITION BY Code ORDER BY [Date] ROWS UNBOUNDED PRECEDING)
FROM dbo.YourTable
ORDER BY [Date];
但是,现在我需要对该代码进行改进:

假设我有下表:

   Date          | Code
   ------------------------
   2010/01/01    | 25
   2010/01/01    | 22
   2010/01/01    | 23
   2010/01/01    | 25
   2010/01/02    | 23
   2010/01/02    | 23
   2010/01/03    | 23
   2010/01/04    | 23
   2010/01/05    | 23
   2010/01/06    | 23
   2010/01/07    | 23
   .....
   2013/03/02    | 21
现在,我需要计算在特定时间段内发生的次数。所需输出如下(为了简单起见,假设时间范围为n=2天)

也就是说,我需要知道在过去的“n”个月中,代码“x”在我的表中出现了多少次

这是在SQL Server 2012中运行的

提前谢谢。

试试这个

     SELECT * FROM 
            (SELECT 
            ROW_NUMBER() OVER (PARTITION BY Code,[Date] ORDER BY [Date]) AS NO,
            [Date], Code, 
            COUNT(1) OVER (PARTITION BY Code ,[Date]) AS [Count] 
        FROM dbo.YourTable Where date between dateadd(m, -n, GETDATE()) and GETDATE() ) 
AS T1 WHERE No = 1
        ORDER BY [Date];
或者试试这个

 SELECT * FROM 
                (SELECT 
                ROW_NUMBER() OVER (PARTITION BY Code,[Date] ORDER BY [Date]) AS NO,
                [Date], Code, 
                COUNT(1) OVER (PARTITION BY Code ,[Date]) AS [Count] 
            FROM dbo.YourTable Where 
    Code = 25 And
    date between dateadd(m, -n, GETDATE()) and GETDATE() ) AS T1 WHERE No = 1
            ORDER BY [Date];
请尝试:

SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY Code ORDER BY Code) Occurrences 
FROM YourTable
ORDER BY Occurrences
请尝试此查询

查询1

select 
  count(*) as CountOccurance,
  code
from 
  tbl 
where 
  code = 21 and 
  date between dateadd(m, -5, SYSDATETIME ()) and SYSDATETIME ()
group by 
  code
| COUNTOCCURANCE | CODE |
-------------------------
|              1 |   21 |
结果

select 
  count(*) as CountOccurance,
  code
from 
  tbl 
where 
  code = 21 and 
  date between dateadd(m, -5, SYSDATETIME ()) and SYSDATETIME ()
group by 
  code
| COUNTOCCURANCE | CODE |
-------------------------
|              1 |   21 |
如果要计算所有代码值,请删除where子句

希望这有助于使用选项、运算符和排名功能

 ;WITH cte AS
 (
  SELECT [Date], Code
  FROM dbo.YourTable  
  GROUP BY [Date], Code
  )
  SELECT c.Date, c.Code, o.Occurrences
  FROM cte c 
    CROSS APPLY (
                 SELECT t2.[Date], t2.Code,
                        ROW_NUMBER() OVER(PARTITION BY c.[Date] ORDER BY t2.[Date]) AS Occurrences        
                 FROM dbo.YourTable t2
                 WHERE c.Code = t2.Code
                   AND DATEDIFF(day, t2.[Date], c.[Date]) BETWEEN 0 AND 1
                 ) o
  WHERE c.Code = o.Code AND c.[Date] = o.[Date] 
  ORDER BY c.[Date]
演示

为了提高性能,请使用此索引

CREATE INDEX x ON dbo.YourTable([Date], Code)

SQL Server的哪个版本?谢谢您的回复。然而,不幸的是,它没有产生期望的输出。在这种情况下,我不想在输出中引入过滤器(其中日期介于…)而是通过计算引入这种过滤器。我需要保留我拥有的行数,来计算附加到日期(注意日期重复)的代码在前“n”个月中出现的次数。我希望现在对这个问题的解释更清楚了。你没听清楚你在说什么吗。。您只需添加
n
,它指示我们必须搜索记录的月份数。。如果我错了,你能以表格的形式显示你想要的输出吗?谢谢@Alexander,它在演示中似乎工作得很好。只有一个问题:如果我创建索引,我是否能够将输出表复制到一个新表中?@Alfons什么表:临时表、变量表或现有表,以及为什么需要复制?我想将查询结果复制到一个新表中,因为我需要使用它并将此信息用于其他表。我需要的特定表将是查询的结果,即sqlfiddle演示中生成的表。没问题,您可以在表源上创建索引,如果需要在新表上创建新索引,也可以创建索引。