0

我有一个具有以下结构的表:

    Account_No   Contact Date
    -------------------------
    1            2013-10-1
    2            2013-9-12
    3            2013-10-15
    3            2013-8-1
    3            2013-8-20
    2            2013-10-25
    4            2013-9-12
    4            2013-10-2

我需要搜索表格并返回两个联系日期在 30 天内的任何帐号。某些帐号可能有 5 或 6 个联系日期。我基本上只需要返回所有完整的帐号和彼此之间 30 天内的记录,而忽略其余的。联系日期被存储为日期数据类型。

因此,例如帐号 3 将返回 2013-8-1 和 2013-8-20 记录,并且帐号 4 的两条记录也会出现,但不会出现其他帐号记录和帐号 3 2013 年 10 月 15 日。

我正在使用 SQL Server 2008 R2。

提前感谢您的帮助!

4

3 回答 3

2

您可以将 DATEADD 用于 +/-30 天,并与时间窗口进行比较:

DECLARE @ContactDates TABLE (
        Account_No  int
    ,   Contact     Date
)

-- Sample data
INSERT @ContactDates (Account_No, Contact)
VALUES
        (1,            '2013-10-01')
    ,   (2,            '2013-09-12')
    ,   (3,            '2013-10-15')
    ,   (3,            '2013-08-01')
    ,   (3,            '2013-08-20')
    ,   (2,            '2013-10-25')
    ,   (4,            '2013-09-12')
    ,   (4,            '2013-10-02')

-- Find the records within +/-30 days
SELECT  c1.Account_No, c1.Contact AS Contact_Date1
FROM    @ContactDates AS c1
   JOIN (
        -- Inner query with the time window
        SELECT  Account_No
            ,   Contact
            ,   DATEADD(dd, 30, Contact) AS Date_Max
            ,   DATEADD(dd, -30, Contact) AS Date_Min
        FROM    @ContactDates
    ) AS c2
        -- Compare based on account number, exclude the same date
        -- from comparing against itself. Usually this would be
        -- a primary key, but this example doesn't show a PK.
        ON (c1.Account_No = c2.Account_No AND c1.Contact != c2.Contact)
-- Compare against the +/-30 day window
WHERE   c1.Contact BETWEEN c2.Date_Min AND c2.Date_Max

这将返回以下内容:

Account_No Contact
========== ==========
3          2013-08-20
3          2013-08-01
4          2013-10-02
4          2013-09-12
于 2013-10-30T23:49:27.297 回答
1

在 SQL Server 2012 中,您将拥有lag()lead()函数。在 2008 年,您可以对同一日历月中的值执行以下操作:

select distinct account_no
from t t1
where exists (select 1
              from t t2
              where t1.account_no = t2.account_no and
                    datediff(month, t1.ContactDate, t2.ContactDate) = 0
             )

当日期在不同月份时,定义什么是“月份”是一个挑战。(3 月 16 日是 2 月 15 日之后的“一个月”吗?它们的时间比 1 月 1 日和 1 月 31 日更近。)你可以只用 30 天:

select distinct account_no
from t t1
where exists (select 1
              from t t2
              where t1.account_no = t2.account_no and
                    datediff(day, t1.ContactDate, t2.ContactDate) <= 30
             )
于 2013-10-30T23:30:08.430 回答
0

这些记录中的每一个都有一个 id 吗?如果是这样,您不需要像我一样创建一个,而是基于您发布的数据

With cte as
(
    Select *, 
        row_number() over (order by contact_date) id
    From tbl
)

Select *
From cte b
Where exists (
    Select 1
    From cte a
    Where a.account_no = b.account_no
    And a.id <> b.id
    And a.contact_date between b.contact_date and dateadd(d, 30, b.contact_date)
 )
于 2013-10-31T00:06:44.187 回答