找到几个月之间的差距

时间:2016-03-21 19:00:49

标签: sql-server

我有一个SQL Server表,其中包含日期字段,人名和唯一标识符。这些日期都在2015年之内,并且是按周末日期。例如2015-12-05,然后是2015-12-12。我需要找到一个具有至少3个月数据间隔的唯一标识符列表。

因此,如果唯一标识符A具有2015-12-12和2015-07-25的条目,那么我希望在我的结果中看到它。如果它的条目更一致,比如说每月一周,那么我不想在我的结果中看到它。我需要在2015年的任何地方显示3个月差距的所有唯一标识符。

我不确定从哪里开始。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您如何看待这个:

ANSI 89

SELECT t1.* from
your_table as t1,your_table as t2
where DATEDIFF(month,t1.your_date_field,t2.your_date_field) >= 3 and 
t1.your_unique_id=t2.your_unique_id and 
not exists(
    select 1 
    from your_table as t3 
    where t3.your_unique_id = t1.your_unique_id and
    DATEDIFF(month,t1.your_date_field,t3.your_date_field) < 3 
)

ANSI 92

SELECT t1.* from
your_table as t1 
    inner join your_table as t2 on t1.your_unique_id=t2.your_unique_id
where DATEDIFF(month,t1.your_date_field,t2.your_date_field) >= 3 and 
not exists(
    select 1 
    from your_table as t3 
    where t3.your_unique_id = t1.your_unique_id and
    DATEDIFF(month,t1.your_date_field,t3.your_date_field) < 3 
)

您需要更多解释吗?

答案 1 :(得分:0)

我建议像这样使用APPLY:

SELECT DISTINCT t1.id FROM <table> t1 
    CROSS APPLY (SELECT TOP 1 t.date FROM <table> t 
        WHERE t.id = t1.id AND t.date < t1.date ORDER BY t.date DESC) t2
WHERE DATEDIFF(month, t1.date, t2.date) >= 3

答案 2 :(得分:0)

我最终使用了Rank功能,并为表中的每个标识符排列了几个月。例如,

select identifier,month,RANK() OVER (PARTITION BY identifier ORDER BY month ) rnk

table1

然后我将此查询中的所有数据上传到临时表中。然后我使用了前导和滞后函数来拉动前一行月和下一行月。 确保正确订购了所有数据。我也将它插入到临时表中。

select identifier,rnk,lag(month) over (order by identifier) PreviousMonth,month,lead(month) over (order by identifier) NextMonth from #table group by identifier,month,rnk

然后我查询了临时表,以显示差距为3个月或更长时间。

select identifier, PreviousMonth,NextMonth,Month-PreviousMonth as Month_Gap from #table2 where month-PreviousMonth >0 and month-PreviousMonth >=3 and rnk>1

我希望这有帮助并且有意义。 所以我的最终输出结果如下所示。

table2