2016-12-05 31 views
0

私は解決しようとしている複雑な問題があります。私と一緒にお立ち寄りください。お気軽にご質問ください。私は非常にSQLに慣れていて、この問題を抱えています...テーブルからの中央値の検索、日付別グループSQLServer

値のグループの中央値を数える必要があります。今では値はテーブルに与えられていません。値は、日付別にグループ化された時間別の出現に基づく表から派生します。

ここでは、データがプールされるサンプルテーブルを示します。

CREATE TABLE Table22(
    Request_Number BIGINT NOT NULL 
    ,Request_Received_Date DATETIME NOT NULL 
); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (2016311446,'8/9/16 9:56'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20163612157,'9/6/16 9:17'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (2016384250,'9/12/16 14:52'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20162920101,'4/19/16 8:11'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (2016418170,'10/6/16 12:28'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (2016392953,'9/6/16 12:39'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20164123416,'10/6/16 15:05'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (2016335972,'8/9/16 7:49'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20162622951,'9/6/16 9:57'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20163913504,'9/6/16 9:47'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20163211326,'9/6/16 12:38'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20163610132,'8/30/16 16:34'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20164119560,'10/6/16 15:53'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (2016334416,'8/10/16 11:06'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20164320028,'10/6/16 15:27'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (20163515193,'8/24/16 19:50'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (2016159834,'4/19/16 13:21'); 
INSERT INTO Table22(Request_Number,Request_Received_Date) VALUES (2016178443,'4/19/16 13:05'); 

テーブルには、Request_NumberとRequest_Received_Dateという2つの列があります。 Request_Numberは一意ではなく、無関係です。私は、その日(24時間)内に特定の日付と時間に受信されたリクエストの数を探しています。日付のエントリがあるたびに、それは1つのオカレンスとしてカウントされます(TicketCount)。私は、COUNT文を使ってRequest_received_dateから*を数え、日付と時間でグループ化することができます。

私はちょうどそれをしたし、私のスクリプト内で一時テーブルを作成しました:

CREATE TABLE #z (ForDate date, OnHour int, TicketCount int) 
INSERT INTO #z (ForDate, OnHour, TicketCount)   
SELECT CAST(Request_received_date as DATE) AS 'ForDate', 
       DATEPART(hh, request_received_date) AS 'OnHour', 
       COUNT(*) AS TicketCount /*Hourly Ticket Count Column*/ 
       FROM Table22 
       GROUP BY CAST(request_received_date as DATE), DATEPART(hh, request_received_date) 
       ORDER BY ForDate Desc, OnHour ASC 

SELECT * FROM #z order by ForDate Desc, OnHour ASC 

は今、私は一日あたりのカウントの中央値を見つけるの最も困難な時間を過ごしています。私は中央値計算のために多くの異なる公式を試して、ほとんどのものを動作させることができました。メジアン計算の多くの異なる例がここにあります。 https://sqlperformance.com/2012/08/t-sql-queries/median

私は中央値を見つけるためにこのスクリプトが好きです。中央値を求めるためのスクリプトは簡単です。しかし、Request_Received_Dateのすべての値の中央値が求められます。私はここで日付の句によってグループを使用する方法を見つけることができません。

DECLARE @Median DECIMAL (12,2); 

SELECT @Median = (
    (SELECT MAX(TicketCount) FROM 
    (SELECT TOP 50 PERCENT TicketCount FROM #z ORDER BY TicketCount) AS BottomHalf) 
    + 
    (SELECT MIN(TicketCount) FROM 
    (SELECT TOP 50 PERCENT TicketCount FROM #z ORDER BY TicketCount DESC) AS TopHalf))/2; 

SELECT @Median 

本当にありがとうございます。

期待される結果は、このようなものです:

ForDate Median 
10/6/2016 2 
9/12/2016 1 
9/6/2016 2.5 
8/30/2016 1 
8/24/2016 1 
8/10/2016 1 
8/9/2016 1 
4/19/2016 1.5 

答えて

0

どのようにこのようなものでしょうか?短い、SQL-Serverでの

SELECT DISTINCT ForDate, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY TicketCount) OVER (PARTITION BY ForDate) AS Median 
FROM #z; 

は中央値を計算するための2つの方法があります(上記のSQL Server 2012のまたはを使用している場合にのみ適用されます)、あなたはここでそれについて読むことができます:https://msdn.microsoft.com/en-us/library/hh231327.aspx

あなたは比較することができますこれらの両方の場合、ここのコードでは

SELECT DISTINCT 
    ForDate 
    , PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY TicketCount) OVER (PARTITION BY ForDate) AS MedianDisc 
    , PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY TicketCount) OVER (PARTITION BY ForDate) AS MedianCont 
FROM 
    #z; 
+0

私はあなたの質問をより慎重に読んだ後少し答えを更新しましたので、もう一度やり直してください。 – DVT

+0

回答を更新していただきありがとうございます。私もこれを走らせた。私は正しい中央値を得ていません。日付エントリも重複しています。この文ではGROUP BY句を使用できません。私の理解によれば、結果は私が掲示したテーブルのようにすべきです。助言がありますか? 私はpercentile_discステートメントに精通していません。私はその間にそれが働いていない理由を見ていきます。ありがとう –

+0

@FariyaFarhadもう一度やり直してください。 – DVT

関連する問題