2013-07-02 142 views
0

我有一个变动报告表,有两列ChangedTime,文件名enter image description here如何为以下情况编写SQL查询。

请考虑此表有1000条记录

在这里,我需要查询基于以下因素的所有变化

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

这意味着当我们给了间隔1分钟和没有文件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分的记录。

在此先感谢。

+5

当你说:“超过1000条记录”我听到“不是很多” –

+2

所以请考虑超过1000万条记录 – kombsh

+0

如何准确的是你的“changedTime”?这是第二次还是只是一分钟?它包括一天吗? –

回答

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会做。

+0

感谢您的回复..我得到一个错误“。”附近的语法错误...我的表名有char'。'但是我已经用[] – kombsh

+0

@kombsh加上了名字。 。 。虽然SQL很聪明,但不会产生针对不存在字符的错误。答案中的代码没有''。''字符,所以它在翻译过程中很有用。你能编辑你的问题并添加产生错误的代码吗? –

+0

嗨请检查我的问题中的代码 – kombsh

0

这样的事情应该可以工作: 您可以使用COUNT()函数来计算记录数。 然后你限制与WHERE子句的选择:http://msdn.microsoft.com/en-us/library/ms187922.aspx

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

where子句是BETWEEN是一个有用的另一种方法。

你没有说明你正在使用哪个SQL DB,所以我假定它的MSSQL。

+0

谢谢你的回复..但是这里我不知道STAR和END的时间间隔..我只知道1分钟的时间间隔退出在任何时间在表 – kombsh

+0

啊,我没有看到一个:) 然后由@ gordon-linoff说的答案是你寻找的 – Datux

+0

好的谢谢你的回答 – kombsh

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 
+0

谢谢你的答案 – kombsh