1

データベース内のサブスクライバーが最も多くの電子メールを開く時刻を見つけようとしています。

多数のサブスクライバーIDを含むテーブルがあり、送信されたEメールを格納するテーブルにマップされたEメール開始レコードを含む別のテーブルがあります。このテーブルは特定のサブスクライバーIDにマップされます。

したがって、私の基本的な要望は、各行が特定のサブスクライバー(サブスクライバーID)であり、最も多くの電子メールを開いた時間であるテーブル出力を取得することです。したがって、最初に各サブスクライバーIDを調べてから、一時テーブルを作成する必要があります。各行は、その時間に開いた電子メールの数に関連付けられた異なる時間です。次に、[最大]を選択して、その一時テーブルから最大行を取得する必要があります。次に、それを出力テーブルに配置し、次のサブスクライバーに対して繰り返す必要があります。

私が気にするのは時間です。私は月、年、時間を気にしません。人々が主にメールを開く時間帯を知りたいだけです。

私はCTEとwhileループを使用して試行錯誤してきましたが、役に立ちませんでした。どんな助けでも大歓迎です。

(最小化された)構造は次のとおりです。

表:サブスクライバー

| サブスクライバーID| last_name | first_name |
| 9999999999 | スミス| ジョン|

テーブル:SentEmail

| message_id | サブスクライバーID|
| 9028340 | 9999999999 |

表:OpenEmails

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

私の目標は、次のような出力テーブル(最後の列は不要)で、各subscriber_idはリスト内で一意です。

| サブスクライバーID| OpenHour | NumOpens |
| 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 に答える