tsql 查找过去 18 个月未联系的成员
tsql to find members not contacted in past 18 months
我有一个 table,它有 ContactNumber (Bigint)、MemberNumber(bigInt) 和 ContactDate(date)。
table 有数百万条记录(附样本数据图像)。我想获取过去 18 个月未联系会员的所有记录。我如何使用 tsql 做到这一点?
非常感谢您的帮助。
谢谢。
您必须有一个成员 table 包含您的所有成员,对吗?假设你这样做了,只是 select 在过去 18 个月内没有联系的所有成员。
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 m
WHERE NOT EXISTS
(
SELECT *
FROM Contacts
WHERE MemberNumber = m.MemberNumber
AND ContactDate > DATEADD(MONTH, -18, GETDATE())
)
I want to get all the records where member has not been contacted for last 18 months.
您可以使用 not exists
:
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)
上的索引,这应该是相当有效的。
另一种选择是使用 window 函数:
select *
from (
select t.*, max(ContactDate) over(partition by MemberNumber) maxContactDate
from mytable t
) t
where maxContactDate < dateadd(month, -18, cast(getdate() as date))
我有一个 table,它有 ContactNumber (Bigint)、MemberNumber(bigInt) 和 ContactDate(date)。
table 有数百万条记录(附样本数据图像)。我想获取过去 18 个月未联系会员的所有记录。我如何使用 tsql 做到这一点?
非常感谢您的帮助。
谢谢。
您必须有一个成员 table 包含您的所有成员,对吗?假设你这样做了,只是 select 在过去 18 个月内没有联系的所有成员。
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 m
WHERE NOT EXISTS
(
SELECT *
FROM Contacts
WHERE MemberNumber = m.MemberNumber
AND ContactDate > DATEADD(MONTH, -18, GETDATE())
)
I want to get all the records where member has not been contacted for last 18 months.
您可以使用 not exists
:
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)
上的索引,这应该是相当有效的。
另一种选择是使用 window 函数:
select *
from (
select t.*, max(ContactDate) over(partition by MemberNumber) maxContactDate
from mytable t
) t
where maxContactDate < dateadd(month, -18, cast(getdate() as date))