Sql server Datediff SQL server查询统计数据(按计数和分组)

Sql server Datediff SQL server查询统计数据(按计数和分组),sql-server,join,datediff,Sql Server,Join,Datediff,因此,我试图得到的是,相对于上次收到通知的时间,有多少用户触发了EventCode 90 源表如下所示: 军人 UserNr RegisteredUntil NotificationMonth 532091985 2016-05-15 00:00:00.000 5 950628185 2016-03-15 00:00:00.000 3 561007126 2016-09-15 00:00:00.000 9 通

因此,我试图得到的是,相对于上次收到通知的时间,有多少用户触发了EventCode 90

源表如下所示:

军人

UserNr         RegisteredUntil            NotificationMonth
532091985      2016-05-15 00:00:00.000    5
950628185      2016-03-15 00:00:00.000    3
561007126      2016-09-15 00:00:00.000    9
通知

UserNr         NotificationNr     NotificationDate            Service
532091985      134567             2013-04-16 00:00:00.000     1
532091985      153468             2014-04-15 00:00:00.000     1
950628185      235481             2014-02-17 00:00:00.000     1
561007126      354812             2012-08-15 00:00:00.000     1
事件日志

Time                        EventCode      UserNr
2012-12-19 00:00:00.000     90             561007126
2014-05-02 00:00:00.000     90             120456873
2009-08-24 00:00:00.000     90             935187423
我想要的桌子是这样的:

CancMonth CancAmount
0         49091
1         53564
2         14308
到目前为止,我得到的是

Select Max(datediff(month, I.NotificationDate, E.Time)  ) as CancMonth
,Count(datediff(month, I.NotificationDate, E.Time)  ) as CancAmount

From ServiceOne P, Eventlog E, Notifications N
Where P.UserNr=E.UserNr
AND P.UserNr=N.UserNr
AND E.EventCode = 90 --EventCode 90 is both flagging for deregistration and manual deregistration
AND N.Service=1
AND P.Status In (0,4) -- 0 is not registered and 4 is flagged for deregistration
AND datediff(month, N.NotificationDate, E.Time ) < 13 --Notifications are sent once a year
AND N.NotificationDate < E.Time

Group By datediff(month, N.NotificationDate, E.Time )
Order By CancMonth
我计算了一下它总共提供了多少条记录,它返回的信息比我在ServiceOne中的被动和标记用户多了大约35000条

非常感谢您的帮助,因为这几天我头痛得厉害


编辑:我添加了我的源表和所有可能可用的列以及一些随机样本数据

这就是您要查找的吗

--I assue that Latest NotificationDate has Largest NotificationNr

SELECT      MAX(DATEDIFF(MONTH, I.NotificationDate, E.Time)) AS CancMonth,
            COUNT(DATEDIFF(MONTH, I.NotificationDate, E.Time)) AS CancAmount
FROM        ServiceOne P 
JOIN        Eventlog E ON P.UserNr  =E.UserNr 
JOIN        (
            SELECT  N.*
            FROM    Notifications N
            JOIN    (
            SELECT  UserNr,
                    MAX(NotificationDate) NotificationDate,
                    MAX(NotificationNr) NotificationNr        
            FROM    Notifications) LU 
    ON      N.UserNr = LU.UserNr 
    AND     N.NotificationDate = LU.NotificationDate 
    AND     N.NotificationNr = LU.NotificationNr
            ) N ON P.UserNr = N.UserNr 
WHERE       E.EventCode = 90 
AND         N.Service=1
AND         P.Status In (0,4)
AND         DATEDIFF(MONTH, N.NotificationDate, E.Time ) < 13
AND         N.NotificationDate < E.Time
GROUP BY    DATEDIFF(MONTH, N.NotificationDate, E.Time )
ORDER BY    CancMonth

我确实发布了一个建议使用连接的答案,我删除了它,因为它看起来很明显。你试过加入吗?您是否有时间创建一个SQLFIDLE以便我们可以查看表结构和示例数据?我确实看到了您的答案,并在我的问题中添加了一些示例数据。不幸的是,用左连接是不可能的。你建议的那个已经工作了23分钟了,现在还没有完成。至于sqlfiddle,我甚至不完全确定这是什么,这些表上有索引吗?现有代码使用内部联接,但如果逻辑需要,则可能需要使用外部联接。对不起,我这么没经验,但是外部连接和内部连接的区别是什么?不管怎样,下面的Jithin给出了一个很好的答案,解决了我的问题。joins:这正是我想要的,谢谢你的帮助!顺便说一句,为什么这个查询会这么快?它是一个巨大的嵌套连接,它将具有数十万条记录的表拉到一起。然而,它在5秒钟内就完成了。有趣的是。如果NotificationDate和NotificationNr并行增加,您只需要单独使用MAXNotificationNr。我确实注意到了这一点,并冒昧地从查询中删除了NotificationNr,因为我真正需要的是从通知中删除Date和UserNr到PairJ。关于您的代码,我也忘了提到一件事。要使其正常工作,您需要在LU Select子查询中添加Group by CUSTOMENR