2013-03-21 5 views
1

Я пытаюсь найти час дня, когда абонент в моей базе данных открывает большинство писем.SQL Server Компиляция и вычисление данных из нескольких таблиц

У меня есть таблица с кучей идентификаторов подписчиков, у меня есть другая таблица с открытыми записями электронной почты, сопоставленная с таблицей, в которой хранятся отправленные письма, которые затем сопоставляются с конкретными идентификаторами подписчиков.

Итак, мое основное желание состоит в том, чтобы получить вывод таблицы с каждой строкой, являющейся конкретным подписчиком (идентификатором абонента), и часом, когда они открыли больше всего сообщений электронной почты. Поэтому мне нужно сначала пройти через каждый идентификатор подписчика, создайте временную таблицу, каждая строка которой будет отличаться от количества писем, которые они открыли в этот час. Затем мне нужно сделать выбор Max, чтобы получить максимальную строку из этой таблицы temp, затем мне нужно поместить это в мою выходную таблицу и повторить для следующего подписчика.

Все, что касается меня, это час дня. Меня не волнует месяц, год или время. Я просто хочу знать, что час дня люди в основном открывают электронные письма.

Я пытался и пытался, используя CTE и в то время как петли, но безрезультатно. Любая помощь будет принята с благодарностью.

Вот (минимизируется) структура:

Таблица: Абоненты

| подписчик | last_name | first_name |
| 9999999999 | Смит | Джон |

Стол: SentEmail

| message_id | подписчик |
| 9028340 | 9999999999 |

Таблица: OpenEmails

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

Моя цель, выходной таблицы, как это (последний столбец ненужно) с каждым subscriber_id быть уникальным в списке:

| подписчик | OpenHour | NumOpens |
| 999999999 | 10 | 32 |

+0

Добро пожаловать в SO. Лучший способ продолжить этот вопрос - создать определение данных и то, что вы пробовали до сих пор (DML), используя SQLFiddle (http://sqlfiddle.com/). –

+0

Попробуйте присоединиться к этим таблицам, затем группе по идентификатору абонента, DATEPART (HH, opendate), затем подсчитывайте идентификатор электронной почты или что-то еще. Если вам нужен код запроса, вам нужно поделиться своей схемой и некоторыми примерами данных. – ljh

ответ

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 
+0

Это возвращает список всех идентификаторов абонента и счетчик для каждого часа, который у них есть в базе данных. Поэтому я получаю несколько строк на каждого абонента –

+0

Я внес изменения. Попробуй. –

+0

Это выглядит многообещающе, но я получаю нечетные результаты, такие как 0000000Jay AND = «00919322» в качестве идентификаторов подписчика. Идентификатор подписчика хранится как varchar's, является ли причиной проблемы? –

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 
+0

Похоже, что это сработало, но я получаю больше одной строки на подписчика. –

+0

Это даст вам одну строку в день. Вам нужен час с наибольшей активностью в течение длительного периода времени? –

+0

Похоже, у вас есть ответ, который работает для вас, поэтому не беспокойтесь. Рад, что вы поняли это. –

Смежные вопросы