2014-01-21 66 views
0

SQL Server编程的新手,想查看我是否可以获得有关此查询的帮助。 说我有LatencyInfo自定义聚合函数或sql server中的等价物

DateTime    Latency 
2014-01-21 00:00:00 12334 
2014-01-21 00:00:00 56384 
2014-01-20 00:00:00 1232 
2014-01-20 00:00:00 4353 
2014-01-19 00:00:00 434343 

我的目标是要找到95个百分点的延迟时间为每天的查询表。所以,我能够拿出第95个百分点作为单一日期,但我坚持将它聚合到日期上。我无法使用PERCENTILE-CONT,因为我所碰到的sql server版本不支持此查询。

select MIN(P.latency) 
from 
    (select top 5 PERCENT S.latency as PerLatencyInfo 
    from 
     (select convert(varchar(20), datetimefield, 1) as datefield 
      ,latency 
     from LatencyInfo 
     where datetimefield >= '2014-01-21 00:00:00' 
    ) as S 
    order by S.latency DESC 
) as P 

任何帮助非常感谢它。我无法在这里尝试CLR聚合,因为我无法在服务器上安装.NET框架。

如果我不能使用自定义聚合函数,即使我可以得到任何其他等效逻辑的帮助,它会很好。

使用SQL Server 11.0.9

+1

您使用的是哪个版本的SQL Server? – NickyvV

+0

[[计算第95个百分点值?](http://stackoverflow.com/questions/6784299/calculating-the-95th-percentile-value)]这里提供了[Oracle的PERCENTILE_CONT实现使用SQL Server 2005分析函数的链接](http://blogs.msdn.com/b/sqltips/archive/2006/05/15/598372.aspx)文章。 –

+0

使用Sql Server 11.0.9206 – user3167619

回答

0

在SQL Server 2005或更高版本,可以使用窗口的功能,做同样的事情:

select cast(datetime as date) as thedate, latency 
from (select pli.*, 
      row_number() over (partition by cast(datetime as date) order by latency) as seqnum, 
      count(*) over (partition by cast(datetime as date)) as daycnt 
     from PerLatencyInfo 
    ) pli 
where seqnum = 0.95 * daycnt; 

seqnum只是列举从最低的每一天值延迟到最高延迟。值daycnt是当天的总数。第95百分位在where条款中计算。

一些笔记。

  • 的SQL Server 2005不支持cast(as date),但也有其他的机制,如您convert()
  • 这不会在值之间进行插值。
+0

你的意思是SQL Server 2008或更高版本呢?因为在你的笔记里你说'CAST(AS DATE)'在2005年不工作? – NickyvV

+1

@NickyvV分析/窗口函数可以在2005+,'DATE'在2008+中获得。 –

+0

@NickyvV。 。 。我只是认为'cast(date as date)'是最好的语法,但还有其他方法。正如其他评论所述,我使用的窗口函数可用于SQL Server 2005以上版本。 –

0

你应该看看NTILE窗口函数。

在下面的示例中,我已经使用了NTILE(20),它将返回的行拆分成5%的块,并为每个块分配一个从1到20的数字。

SELECT [DateTime], Latency 
FROM (SELECT [DateTime], 
     Latency, 
     NTILE(20) OVER (PARTITION BY cast([DateTime] as date) ORDER BY Latency ASC) Top5 
      FROM  latencyInfo 
     ) x 
WHERE Top5 = 1 

分区上的DateTime行,这样它会执行对延迟订购的每个日期和升序的NTILE功能(最小的云在顶部NTILE)。

然后,我所要做的就是选择最高百分位数中的所有东西。 (Where Top5 = 1