我有一个SQL Server表,其中包含日期字段,人名和唯一标识符。这些日期都在2015年之内,并且是按周末日期。例如2015-12-05,然后是2015-12-12。我需要找到一个具有至少3个月数据间隔的唯一标识符列表。
因此,如果唯一标识符A具有2015-12-12和2015-07-25的条目,那么我希望在我的结果中看到它。如果它的条目更一致,比如说每月一周,那么我不想在我的结果中看到它。我需要在2015年的任何地方显示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
然后我将此查询中的所有数据上传到临时表中。然后我使用了前导和滞后函数来拉动前一行月和下一行月。 确保正确订购了所有数据。我也将它插入到临时表中。
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
我希望这有帮助并且有意义。 所以我的最终输出结果如下所示。