2016-12-05 2 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'); 

Таблица содержит 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 

ответ

0

Как о чем-то вроде этого? (Только применяется, если вы используете SQL Server 2012 или выше)

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

Короче говоря, SQL-сервер имеет два способа вычисления медианы, вы можете прочитать об этом здесь: 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

 Смежные вопросы

  • Нет связанных вопросов^_^