1

我试图找出我数据库中的订阅者在一天中打开最多电子邮件的时间。

我有一个包含一堆订阅者 ID 的表,我还有另一个表,其中电子邮件打开记录映射到一个表,该表存储已发送的电子邮件,然后映射到特定的订阅者 ID。

所以我的基本愿望是得到一个表格输出,每一行都是一个特定的订阅者(订阅者 ID)以及他们打开最多电子邮件的时间。所以我需要先检查每个订阅者 ID,然后我想创建一个临时表每行是与他们在该小时内打开的电子邮件数量相关的不同小时。然后我需要选择 Max 以从该临时表中获取最大行,然后我需要将其放入我的输出表中,并为下一个订阅者重复。

我只关心一天中的时间。我不在乎月份、年份或时间。我只是想知道人们在一天中的什么时间最常打开电子邮件。

我一直在尝试使用 CTE 和 while 循环,但无济于事。任何帮助将不胜感激。

这是(最小化)结构:

表:订户

| 订阅者 ID | 姓氏 | 名字 |
| 9999999999 | 史密斯 | 约翰 |

表:已发送电子邮件

| message_id | 订阅者 ID |
| 9028340 | 9999999999 |

表:OpenEmails

| open_id | message_id | dtoped |
| 9923489 | 9028340 | '2011-11-22 15:53:02.157' |

我的目标是这样的输出表(最后一列是不必要的),每个subscriber_id 在列表中都是唯一的:

| 订阅者 ID | 开放时间 | 打开次数 |
| 999999999 | 10 | 32 |

4

2 回答 2

0

您必须弄清楚如何使用正确的列对其进行调整,以及由于未提供架构而无法解决的问题...

With    orderedHourly As
(
        Select  SubscriberID, 
                Convert(Date,OpenDateTime) OpenDate, 
                Hour(OpenDateTime) OpenHour, 
                Row_Number() Over (Partition By SubscriberID, Convert(Date,OpenDateTime) Order By Count(1) Desc) As HourPriority
        From    subscriber s
        Join    email e
                On  s.subscriberID = e.subscriberID
        Group   By SubscriberID, Convert(Date,OpenDateTime), Hour(OpenDateTime)
)
Select  SubScriberID, OpenDate, OpenHour
From    orderHourly
Where   HourPriority = 1
于 2013-03-21T21:29:46.603 回答
0

我做了一些假设,因为没有包含结构。

这是我使用的结构。

CREATE TABLE Subscriber (
    Id int not null identity(1,1),
    SubscriberId varchar(50)
    )
CREATE TABLE EmailOpened (
    OpenDate DateTime,
    EmailId int
    )
CREATE TABLE Emails (
    EmailId int not null identity(1,1),
    SubscriberId varchar(50),
    EmailText varchar(max)
)
GO

这是我最终得到的查询。

WITH OpenedByHour AS (
    SELECT 
        SubscriberId,
        DATEPART(YEAR, OpenDate) AS OpenYear,
        DATEPART(DAYOFYEAR, OpenDate) AS OpenDOY,
        DATEPART(HOUR, OpenDate) AS OpenHour,
        COUNT(1) AS OpenCount
    FROM Emails
    JOIN EmailOpened
        ON Emails.EmailId = EmailOpened.EmailId
    GROUP BY 
        SubscriberId,
        DATEPART(YEAR, OpenDate),
        DATEPART(DAYOFYEAR, OpenDate),
        DATEPART(HOUR, OpenDate)
    ),
    MaxOpenedByHour AS (
    SELECT
        SubscriberId,
        OpenYear,
        OpenDOY,
        OpenHour,
        OpenCount,
        Row_Number() Over (Partition By SubscriberId
                Order By OpenCount Desc) AS MaxRow
    FROM OpenedByHour
    )
SELECT SubscriberId,
    OpenYear,
    OpenDOY,
    OpenHour,
    OpenCount
FROM MaxOpenedByHour
WHERE MaxRow = 1
于 2013-03-21T21:57:02.657 回答