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
Ich aktualisierte die Antwort ein wenig nachdem ich Ihre Frage genauer gelesen, so dass Sie es vielleicht noch einmal versuchen möchten. – DVT
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 –
@FariyaFarhad Versuchen Sie es erneut. – DVT