我有一个复杂的问题,我试图解决。请耐心等待,随时提出任何问题。我是相当新的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