我们使用的是 MS SQL SERVER 2012。
我们像每次用户调用电话一样进行记录,为用户调用的每个电话添加日期时间和用户 ID 到表中。
现在我需要计算自创建以来用户关闭的最高月度、每周、每日记录。
意思是,我需要计算自创建以来任何用户在给定月份的最高月度计数。所以记录每月计数,以及名字。
我真的不确定如何最好地做到这一点。这就是我现在创建的,我想知道是否有更好或更有效的方法来做到这一点。
这是带有示例的更新版本。 (我应用了日期更改,希望对您有所帮助)
这是每月的记录:
DECLARE @id int, @mr int
DECLARE @first datetime, @last datetime
DECLARE @name nvarchar(60)
DECLARE @UserTable TABLE(
ID int,
Name nvarchar(60)
)
INSERT INTO @UserTable (ID, Name) VALUES (1, 'Tester');
INSERT INTO @UserTable (ID, Name) VALUES (2, 'Dummy');
INSERT INTO @UserTable (ID, Name) VALUES (3, 'User');
DECLARE @SampleTable TABLE(
A_Termin_AE int,
A_Termin_Status int,
A_Termin_Set_Date datetime
)
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, CAST('20090525' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 601, Cast('20090512' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, Cast('20090525' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, Cast('20100803' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, Cast('20100805' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, Cast('20100817' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 601, Cast('20110521' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 601, Cast('20090501' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20090502' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20100815' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110501' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110505' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110508' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110510' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110514' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120503' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120508' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120510' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120514' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120520' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 601, Cast('20130701' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20130703' AS Datetime));
DECLARE @TempTable TABLE(
ID int,
UserID int,
Name nvarchar(60),
Record int,
Datum datetime
)
INSERT INTO @TempTable (ID, UserID, Name, Record, Datum) VALUES (1, 0, '', 0, GETDATE());
SET @first = CAST('20080101' AS Datetime);
WHILE @first < GETDATE()
BEGIN
SET @first = dateadd(month, 1, @first)
SET @last = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@first)+1,0));
DECLARE User_Cur CURSOR
FOR SELECT tu.Id, tu.Name FROM @UserTable tu
OPEN User_Cur;
FETCH NEXT FROM User_Cur INTO @id, @name;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @mr = (SELECT COUNT(t.A_Termin_Set_Date)
FROM @SampleTable t
WHERE t.A_Termin_AE = @id
AND t.A_Termin_Status = 603
AND t.A_Termin_Set_Date BETWEEN @first AND @last);
IF (SELECT Record FROM @TempTable WHERE ID = 1) < @mr
BEGIN
UPDATE @TempTable
SET UserID = @id,
Name = @name,
Record = @mr,
Datum = @first
WHERE ID = 1;
END
FETCH NEXT FROM User_Cur INTO @id, @name;
END
CLOSE User_Cur;
DEALLOCATE User_Cur;
END
SELECT * FROM @TempTable;
所以一个月内调用电话最多的用户是: 2011 年 5 月获得 5 条记录的“假人”;
我感谢任何帮助和建议。
最佳答案
示例数据包含 2 个不同月份的用户,最大计数相同。那你为什么只列出 1?你怎么知道不止 1,可能是 4 或 2 或 37。
SELECT
Name
, Mnth
, Record
, dense_rank() over(ORDER BY record DESC) RNK
FROM (
SELECT
Name
, Mnth
, Record
, dense_rank() over(ORDER BY record DESC) RNK
FROM (
SELECT
tu.Name
, DATEADD(MONTH, DATEDIFF(MONTH, 0, t.A_Termin_Set_Date), 0) AS Mnth
, COUNT(t.A_Termin_AE) AS Record
FROM @SampleTable t
JOIN @UserTable tu ON tu.Id = t.A_Termin_AE
WHERE t.A_Termin_Status = 603
GROUP BY tu.Name, DATEADD(MONTH, DATEDIFF(MONTH, 0, t.A_Termin_Set_Date), 0)
) d1
) d2
WHERE rnk = 1
ORDER BY Mnth DESC, Name
结果:
Name Mnth Record RNK
------- --------------------- -------- -----
User 01.05.2012 00:00:00 5 1
Dummy 01.05.2011 00:00:00 5 1
关于sql - 获取最近 3 年每个月的最大值以选择记录月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46885252/