2014-01-21 88 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