Sql 如何确定多个日期值的模式,以及当存在多个模式时如何执行

Sql 如何确定多个日期值的模式,以及当存在多个模式时如何执行,sql,sql-server,Sql,Sql Server,我有一个表,每行代表一个用户的电子邮件打开事件。我想确定每个用户所有打开事件的模式,以返回用户打开电子邮件当天最常见的时间。如果没有模式我想输出用户打开电子邮件当天的最后一个小时,如果有多个模式我想输出最近打开事件的模式 我想要的结果是一个表,每行代表一个用户ID和一天中发送给他们的最佳时间 在另一篇文章的帮助下,我已经能够确定每个用户的模式并输出它,但是我无法找出当没有模式和当有多个模式时的子句。以下是SQLFIDLE与测试数据的关系以及我到目前为止的查询: 上述小提琴的预期结果表: 谢谢你

我有一个表,每行代表一个用户的电子邮件打开事件。我想确定每个用户所有打开事件的模式,以返回用户打开电子邮件当天最常见的时间。如果没有模式我想输出用户打开电子邮件当天的最后一个小时,如果有多个模式我想输出最近打开事件的模式

我想要的结果是一个表,每行代表一个用户ID和一天中发送给他们的最佳时间

在另一篇文章的帮助下,我已经能够确定每个用户的模式并输出它,但是我无法找出当没有模式和当有多个模式时的子句。以下是SQLFIDLE与测试数据的关系以及我到目前为止的查询:

上述小提琴的预期结果表:


谢谢你的帮助。谢谢

我相信这就是您想要的代码:

SELECT SubscriberKey, Hour
FROM (SELECT SubscriberKey, DATEPART(hour, EventDate) as hour, COUNT(*) as cnt,
             ROW_NUMBER() OVER (PARTITION BY SubscriberKey
                                ORDER BY COUNT(*) DESC, MAX(EventDate) DESC
                               ) as seqnum
      FROM OpenJobs oj
      GROUP BY SubscriberKey, DATEPART(hour, EventDate)
    ) sh
WHERE seqnum = 1;
ORDER BY
中的
MAX(EventDate)
可获取发生平局时的最晚小时数


你不必担心“无模式”。所有数据都有一个模式,尽管可能有很多联系。上面的代码返回了发生平局时的最近一个小时。我认为解决方案的关键是使用
row\u number()
(它从来没有联系)而不是
rank()
(它确实有联系)。

基于小提琴的预期结果是什么?每个订阅人只有一行,目前,由于订户密钥“6078”有两种模式,因此它们显示为两行。此处的
模式是什么?正如@scsimon所说的,您应该将预期输出作为问题的一部分,这样我们就可以进行比较了。@JuanCarlosOropeza在示例fiddle中,订户6078的模式是8和10,因为有两个,所以我只想使用最新事件日期的模式,在本例中为8。为什么要使用
cnt
for?@JuanCarlosOropeza。因为我想在结果集中看到它,即使OP不想看到它。工作完美,谢谢!在我最初的小提琴中,我使用Alter Table将eventdate更改为仅小时,有没有更有效的方法不使用Alter Table来执行此操作?@cmccarra。我不认为添加
hour
列有什么好处,除非您打算在
(SubscriberKey,hour)
@GordonLinoff上添加索引。最终目标是将此反馈到我的电子邮件发送平台,并根据小时数分批发送电子邮件,因此所有小时数为15的用户都会在下午3点自动发送电子邮件,以此类推。