У меня есть сложная проблема, которую я пытаюсь решить. Пожалуйста, несите меня и не стесняйтесь задавать любые вопросы. Я совершенно новичок в 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');
Таблица содержит 2 столбца: Request_Number и Request_Received_Date. Request_Number не уникален и не имеет значения. Я ищу, сколько запросов получено за конкретную дату и ежечасно в течение этой даты (24 часа). Каждый раз, когда есть запись для даты, это считается одним событием (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. Я не могу найти способ использования предложения group by 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
Я обновил ответ после того, как внимательно прочитал ваш вопрос, поэтому вы можете попробовать еще раз. – DVT
Спасибо за обновление ответа. Я тоже побежал. Я не получаю правильное медианное значение. Записи даты также повторяются. Я не могу использовать предложение GROUP BY с этим утверждением. По моему мнению, результаты должны быть такими же, как и в таблице, которую я опубликовал. Какие-либо предложения? Я не знаком с заявлением percentile_disc. Я пока загляну, чтобы понять, почему он не работает. Спасибо –
@FariyaFarhad Попробуйте еще раз. – DVT