如何为以下情况编写SQL查询。

时间:2013-07-02 13:32:31

标签: sql

我有一个更改报告表,其中有两列ChangedTime,FileName enter image description here

请考虑此表有超过1000条记录

在这里,我需要根据以下因素查询所有更改

i) Interval (i.e-1mins )
ii) No of files

这意味着我们给了Interval 1分钟和No Of文件10。     如果在1分钟间隔中的任何一个间隔中更改文件的数量超过10,我们需要在1分钟间隔内获取所有已更改的文件

示例:

  i) Consider we have 15 changes in the interval 11:52 to 11:53
  ii)And consider we have 20 changes in the interval 12:58 to 12:59

现在我的预期结果将是35条记录。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您需要按间隔聚合,然后进行计数。假设从时间0开始的间隔是正常的,则以下情况应该起作用:

declare @interval int = 1;
declare @limit int = 10;

select sum(cnt)
from (select count(*) as cnt
      from t
      group by DATEDIFF(minute, 0, ChangedTime)/@interval
     ) t
where cnt >= @limit;

如果您还有其他时间考虑间隔时间,请将其替换为0

编辑:

针对您的特定查询:

select sum(ChangedTime)
from (select count(*) as ChangedTime
  from [MyDB].[dbo].[Log_Table.in_PC] 
  group by DATEDIFF(minute, 0, ChangedTime)/@interval
 ) t
where ChangedTime >= @limit;

子查询上不能包含三部分别名。 t会这样做。

答案 1 :(得分:0)

这样的事情应该有效: 您使用COUNT()函数计算记录数。 然后使用WHERE子句限制选择:

SELECT COUNT(FileName) 
FROM "YourTable" 
WHERE ChangedTime >= "StartInteval" 
  AND ChangedTime <= "EndInterval";

另一种在where子句中有用的方法是BETWEENhttp://msdn.microsoft.com/en-us/library/ms187922.aspx

您没有说明您正在使用哪个SQL DB,所以我假设它是MSSQL。

答案 2 :(得分:0)

select count(*) from (select a.FileName, 
b.ChangedTime startTime, 
a.ChangedTime endTime, 
DATEDIFF ( minute , a.ChangedTime , b.ChangedTime ) timeInterval
from yourtable a, yourtable b
where a.FileName = b.FileName
and a.ChangedTime > b.ChangedTime
and DATEDIFF ( minute , a.ChangedTime , b.ChangedTime ) = 1) temp
group by temp.FileName