sql - 获取最近 3 年每个月的最大值以选择记录月份

标签 sql sql-server sql-server-2012

我们使用的是 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 

引用:http://rextester.com/DORH41455

关于sql - 获取最近 3 年每个月的最大值以选择记录月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46885252/

相关文章:

c# - 系统找不到 Windows Server 2012 中指定的文件

c# - 在 C# 中使用 sqlcommand 执行查询时出错

mysql - 给定 session 列表计算峰值并发用户

用于比较行的 SQL 查询

mysql - 在 SQL 中显示多条不匹配的记录

sql-server - 在 Windows 批处理文件中将日期附加到文件名

sql-server - 是否有任何工具可以在 Microsoft SQL Server (MSSQL) 上进行迁移(la Ruby)?

php - 准备语句和SQL结果不同

SQL 错误 - 关键字 'Database' 附近的语法不正确

sql - 返回包含最近 24 小时计数的记录