2015-08-19 2 views
0

Мне нужно совместить дату действия пользователя с их номером подписки в то время. Одна запись в таблице Subscription относится к нескольким строкам в таблице Action, а связь между ними - это не месяц (!) Или месяц + год, поскольку подписка длится в течение многих месяцев, когда пользователь предпринимает действия до появления новой даты подписки в действие.Соответствие записи с несколькими записями в SQL Server (множественные отношения)

E.g. все даты действий пользователя, предпринятые между июнем 2011 года по март 2012 года, должны относиться к дате мая 2011 года, потому что эта дата подписки действовала до тех пор, пока в мае 2012 года не была подписана следующая подписка, и этот был продолжен, еще один был сдан в августе 2015 года.

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

Например, в ТВ1 с бревнами действий пользователя У меня есть несколько записей

Jun, 2011 (should link to Subnumber1 active between May 2011- Apr 2012) 
Aug, 2011 (should link to Subnumber1 active between May 2011- Apr 2012) 
Dec, 2011 (should link to Subnumber1 active between May 2011- Apr 2012) 
Mar, 2012 (should link to Subnumber1 active between May 2011- Apr 2012) 
May, 2012 (should link to Subnumber2 active between May 2012- Jul 2015) 
Jun, 2015 (should link to Subnumber2 active between May 2012- Jul 2015) 

Тогда в другой таблице у меня есть подписка на номера пользователя

May, 2011 Subnumber1 
May, 2012 Subnumber2 
Aug, 2015 Subnumber3 

Так в основном, за действия, состоялось в мае 2012 года, запрос должен быть возвращен. Subnumber2

Буду признателен за любую помощь!

+0

Можете ли вы опубликовать образцы данных? Вы используете реальные даты или только месяц, год? –

+0

Вы должны опубликовать свои определения таблиц. В отсутствие этого, похоже, будет простой запрос «SELECT * FROM Subscriptions INNER JOIN Actions ON Actions.ActionDate BETWEEN Subscriptions.StartDate AND Subscriptions.EndDate' –

+0

Единственная проблема заключается в том, что между датой начала и Дата окончания. Каждый раз, когда они продлевают подписку, она становится еще одной датой начала. – Maggie

ответ

0

Это даст вам вывод, который вы хотите:

declare @subscription table(start_date datetime, sub varchar(10)) 
insert into @subscription(start_date, sub) values 
('May, 2011', 'Subnumber1') 
, ('May, 2012', 'Subnumber2') 
, ('Aug, 2015', 'Subnumber3') 

declare @action table(record datetime) 
insert into @action values 
('Jun, 2011'), ('Aug, 2011'), ('Dec, 2011'), ('Mar, 2012'), ('May, 2012'), ('Jun, 2015') 

Select a.record, s.sub, s.start_date, s.end_date From @action as a 
Inner Join (
    Select s1.start_date, e.end_date, s1.sub from @subscription as s1 
    outer apply (
     Select end_date = min(s2.start_date) from @subscription as s2 
      Where s1.start_date < s2.start_date 
    ) as e 
) as s on a.record >= s.start_date and (a.record < s.end_date or s.end_date is null) 

запись суб start_date end_date

2011-06-01 00: 00: 00,000 Subnumber1 2011-05-01 00:00: 00.000 2012-05-01 00: 00: 00.000 2011-08-01 00: 00: 00.000 Subnumber1 2011-05-01 00: 00: 00.000 2012-05-01 00: 00: 00.000 2011-12-01 00 : 00: 00.000 Subnumber1 2011-05-01 00: 00: 00.000 2012-05-01 00: 00: 00.000 2012-03-01 00: 00: 00.000 Subnumber1 2011-05-01 00: 00: 00.000 2012-0 5-01 00: 00: 00.000 2012-05-01 00: 00: 00.000 Подкатегория2 2012-05-01 00: 00: 00.000 2015-08-01 00: 00: 00.000 2015-06-01 00:00: 00.000 Subnumber2 2012-05-01 00: 00: 00.000 2015-08-01 00: 00: 00.000

+0

Благодарим за отзыв. Это было бы здорово, если бы было определенное количество подписчиков на пользователя. К сожалению, у пользователя может быть 8, 10, 20 номеров подписчиков, каждый со своей датой начала и окончания, поэтому я не могу это сделать, чтобы учесть различия между тысячами клиентов. – Maggie

+0

ничего не закодировано. Я просто создал пару переменных таблицы с образцами данных. Предоставьте свою модель данных и образцы данных, и я обновлю свой ответ. вы можете использовать http://sqlfiddle.com/ для создания упрощенной модели данных с образцами данных. –

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