我在table1中的数据看起来像这样:
DateMonthID SubscriberID othercolumns...
201201 106
201201 207
201202 309
201203 405
201203 297
等等
和table2如此:
DateMonthID SubscriberID Level
... ... 1
... ... 2
... ... 1
... ... 3
... ... 2
等等
我需要做的是检查第一个表中哪些订阅者在将来的3个月内不存在于另一个表中。这有意义吗?
示例:将表中的subscriberID 106作为日期201201(1月)。如果它没有出现在201201-201204(1月至4月)的另一张表中,我需要累计一次。
这是我到目前为止所做的,但它似乎返回了太多的值:
SELECT
COUNT(1) AS Total,
table1.month_key,
table2.level
FROM
dbo.table1
INNER JOIN
dbo.table2 ON (table2.subscriber_id = table1.subscriber_id)
WHERE
NOT EXISTS (SELECT * FROM table2
WHERE
(table2.month_key >= table1.month_key AND table2.month_key <= (table1.month_key + 3))
AND table2.subscriber_id = table1.subscriber_id)
GROUP BY
table1.month_key, table2.level
ORDER BY
table2.level, table1.month_key
非常感谢任何帮助
--------------编辑-------------- 只是为了让事情更清楚,因为我不确定我是否正在解释它。情况是在表1中是停止订阅的人和他们停止订阅的日期。事情是这可能不是真的,也许他们只是改变了订阅或一个月后重新订阅。表2是每个月的订户表。我需要找出谁真正取消订阅,通过检查它们是否出现在表2中的日期表1表示他们取消订阅然后接下来的3个月。希望这会有所帮助。
答案 0 :(得分:2)
我认为问题在于您无法在月份键中添加“3”以获得所需内容。试试这个:
FROM (select table1.*,
(cast(left(month_key, 4) as int)*12+
cast(right(month_key, 2) as int)
) as newMonthKey
from dbo.table1
) table1
. . .
where not exists (select 1
from (select table2.*,
(cast(left(month_key, 4) as int)*12+
cast(right(month_key, 2) as int)
) as newMonthKey
from table2
) t
where (t.newmonthkey >= table1.newmonthkey AND t.newmonthkey <= (table1.newmonthkey + 3))
AND t2.subscriber_id = table1.subscriber_id
)
这会将月份密钥更改为自0年以来的月份计数器。