2017-07-31 4 views
1

私は3000レコードのテーブルを持っています。 私が実行している場合はselect * from TableNameSQL Serverデータベースの平均時間を計算するストアドプロシージャを作成する方法

出力:

TestSequence TestName ExecutionSequence ExecutionSeconds 
1     xyz    1   1.63 
1     xyz    2   1.56 
1     xyz    3   1.55 
1     xyz    4   1.55 
1     xyz    5   1.66 
15     abc    1   0.84 
15     abc    2   0.84 
15     abc    3   0.84 
15     abc    4   0.84 
15     abc    5   0.84 
16     ttt    1   1.75 
16     ttt    2   1.45 
16     ttt    3   1.43 
16     ttt    4   1.48 
16     ttt    5   1.50 
17     www    1   5.22 
17     www    2   5.16 
17     www    3   5.22 
17     www    4   5.21 
17     www    5   5.20 
18     ccc    1   3.48 
18     ccc    2   3.47 
18     ccc    3   3.47 
18     ccc    4   3.47 
18     ccc    5   3.49 

各テストは、列ExecutionSequenceによって表される5回を実行しますので、私が達成したいことは最大値と最小値を落としたり抜けてストアドプロシージャを作成することです各testNameのExecutionSecondsを計算し、残りの平均を計算します。3.このプロシージャを作成しようとしていますが、固まっています。ここで

は私のコードです:

USE [db1]; 
GO 
CREATE PROCEDURE tests_CalculateAverageRunTime 
( 

    @TestSenquence varchar(50) = NULL 
)  
AS 
BEGIN 
SET NOCOUNT ON 

     SELECT TestName, TestSequence, AVG(ExecutionSeconds) as AverageRunTime 
     FROM TableName 
     WHERE (@TestSenquence IS NULL OR TestSequence = @TestSenquence) 

     Group By TestName, TestSequence 

SET NOCOUNT OFF 
END 
GO 

答えて

0

あなたが最大値と最小値を持つ行を識別するためにROW_NUMBER()を使用し、それらを除外することができます。

のためのネクタイの場合は
SELECT TestName, TestSequence, AVG(ExecutionSeconds) as AverageRunTime 
FROM (SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY TestName, TestSequence ORDER BY ExecutionSeconds) as seqnum_a, 
      ROW_NUMBER() OVER (PARTITION BY TestName, TestSequence ORDER BY ExecutionSeconds DESC) as seqnum_d 
     FROM TableName t 
     WHERE (@TestSenquence IS NULL OR TestSequence = @TestSenquence) 
    ) t 
WHERE seqnum_a > 1 AND seqnum_d > 1 
Group By TestName, TestSequence; 

最大または最小、1つだけ削除されます。これは、平均3つの値に対するあなたの欲求と一致しています。

+0

ありがとう、これは私が必要なものです! – Immortal

関連する問題