我有一个包含contactnumber(bigint)、membernumber(bigint)和contactdate(date)的表。该表有数百万条记录(附上示例数据图像)。我想得到过去18个月没有联系过会员的所有记录。如何使用tsql实现这一点?非常感谢你的帮助。谢谢。
gmxoilav1#
必须有一个包含所有成员的成员表,对吗?假设你这样做了,只需选择所有在过去18个月内没有联系的成员。
SELECT *FROM Member mLEFT JOIN Contacts c on m.MemberNumber = c.MemberNumber AND c.ContactDate > DATEADD(Month, -18, GETDATE())WHERE c.ContactNumber IS NULL
SELECT *
FROM Member m
LEFT JOIN Contacts c on m.MemberNumber = c.MemberNumber AND
c.ContactDate > DATEADD(Month, -18, GETDATE())
WHERE c.ContactNumber IS NULL
我相信这也行。
SELECT *FROM Member mWHERE NOT EXISTS ( SELECT * FROM Contacts WHERE MemberNumber = m.MemberNumber AND ContactDate > DATEADD(MONTH, -18, GETDATE()) )
WHERE NOT EXISTS
(
FROM Contacts
WHERE MemberNumber = m.MemberNumber
AND ContactDate > DATEADD(MONTH, -18, GETDATE())
)
ukdjmx9f2#
我想得到过去18个月没有联系过会员的所有记录。你可以用 not exists :
not exists
select t.*from mytable twhere not exists ( select 1 from mytable t1 where t1.MemberNumber = t.MemberNumber and t1.ContactDate >= dateadd(month, -18, cast(getdate() as date)))
select t.*
from mytable t
where not exists (
select 1
from mytable t1
where
t1.MemberNumber = t.MemberNumber
and t1.ContactDate >= dateadd(month, -18, cast(getdate() as date))
带索引的 (MemberNumber, ContactDate) ,这应该是相当有效的。另一种选择是使用窗口函数:
(MemberNumber, ContactDate)
select *from ( select t.*, max(ContactDate) over(partition by MemberNumber) maxContactDate from mytable t) twhere maxContactDate < dateadd(month, -18, cast(getdate() as date))
select *
from (
select t.*, max(ContactDate) over(partition by MemberNumber) maxContactDate
) t
where maxContactDate < dateadd(month, -18, cast(getdate() as date))
2条答案
按热度按时间gmxoilav1#
必须有一个包含所有成员的成员表,对吗?假设你这样做了,只需选择所有在过去18个月内没有联系的成员。
我相信这也行。
ukdjmx9f2#
我想得到过去18个月没有联系过会员的所有记录。
你可以用
not exists
:带索引的
(MemberNumber, ContactDate)
,这应该是相当有效的。另一种选择是使用窗口函数: