2016-12-05 8 views
0

Ich habe ein kompliziertes Problem, das ich versuche zu lösen. Bitte tragen Sie mit mir und zögern Sie nicht, Fragen zu stellen. Ich bin ziemlich neu in SQL und habe Schwierigkeiten damit ...Ermitteln des Medianwerts aus einer Tabelle, Gruppieren nach Datum SQLServer

Ich muss den Median einer Gruppe von Werten zählen. Jetzt sind die Werte nicht in einer Tabelle angegeben. Die Werte werden aus einer Tabelle basierend auf stündlichen Vorkommen nach Datum gruppiert.

Hier ist die Beispieltabelle, aus der Daten zusammengefasst werden.

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'); 

Die Tabelle hat 2 Spalten: Request_Number und Request_Received_Date. Request_Number ist nicht eindeutig und ist irgendwie irrelevant. Ich suche, wie viele Anfragen für ein bestimmtes Datum und stündlich innerhalb dieses Datums (24 Stunden) erhalten werden. Jedes Mal, wenn ein Eintrag für ein Datum vorhanden ist, wird dies als ein Ereignis gezählt (TicketCount). Ich kann die COUNT-Anweisungen verwenden, um * von Request_received_date zu zählen und nach Datum und Stunde zu gruppieren.

Ich tat genau das und erstellt eine temporäre Tabelle in meinem Skript:

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 

nun die schwierigste Zeit, die ich habe den Medianwert der Zählung pro Tag zu finden. Ich habe viele verschiedene Formeln für die Mittelwertberechnung ausprobiert und war in der Lage, die meisten davon zum Laufen zu bringen. Viele verschiedene Beispiele der Medianberechnung können hier gefunden werden https://sqlperformance.com/2012/08/t-sql-queries/median

Ich mag dieses Stück des Drehbuchs, um Median zu finden. Das Skript zum Finden des Medians ist einfach. Aber es findet Median für alle Werte von Request_Received_Date. Ich bin nicht in der Lage, einen Weg zu finden, die Klausel Gruppierung nach Datum hier zu verwenden.

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 

Jede Hilfe wird wirklich geschätzt.

Das erwartete Ergebnis ist so etwas wie dieses:

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 

Antwort

0

Wie wäre es so etwas? (Es werden nur gelten, wenn Sie SQL Server 2012 verwenden oder höher)

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

Kurz gesagt, SQL-Server zwei Möglichkeiten hat Median zu berechnen, kann man darüber lesen Sie hier: https://msdn.microsoft.com/en-us/library/hh231327.aspx

Sie vergleichen können sie beide in diesem Fall mit dem Code hier:

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

Ich aktualisierte die Antwort ein wenig nachdem ich Ihre Frage genauer gelesen, so dass Sie es vielleicht noch einmal versuchen möchten. – DVT

+0

Danke für die Aktualisierung der Antwort. Ich habe das hier auch ausgeführt. Ich bekomme nicht den richtigen Medianwert. Die Date-Einträge sind ebenfalls doppelt vorhanden. Ich kann die GROUP BY-Klausel nicht mit dieser Anweisung verwenden. Nach meinem Verständnis sollten die Ergebnisse genauso sein wie die Tabelle, die ich gepostet habe. Irgendwelche Vorschläge? Ich bin nicht vertraut mit Perzentil_disc Aussage. Ich werde das in der Zwischenzeit untersuchen, um zu sehen, warum es nicht funktioniert. Danke –

+0

@FariyaFarhad Versuchen Sie es erneut. – DVT

Verwandte Themen