Sql 确定字段值是否满足一年范围内的最小连续年份

Sql 确定字段值是否满足一年范围内的最小连续年份,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,根据下表 PersonID Year ---------- ---------- 1 1991 1 1992 1 1993 1 1993 2 1990 2 1991 3 1991 3 1992 3 1994 有没有一种方法可以使用SQL select查询来获取PersonID,其中PersonID至少有3行,连续年份在199

根据下表

 PersonID     Year
---------- ----------
1          1991
1          1992
1          1993
1          1993
2          1990
2          1991
3          1991
3          1992
3          1994
有没有一种方法可以使用SQL select查询来获取PersonID,其中PersonID至少有3行,连续年份在1990到1995之间?在这种情况下,它应该只找到Personid1


谢谢你的帮助。

我认为下面的方法应该有效:

SELECT personID
FROM
    (
        SELECT
            CASE WHEN year - min(year) OVER (PARTITION BY PersonID ORDER BY YEAR ASC ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING) = 2 THEN 'x' END as ConsecutiveFlag,
            PersonID
        FROM 
            (SELECT personID, year FROM table GROUP BY personID,year) subquery
        WHERE year BETWEEN 1990 and 1995   
    ) t1
WHERE ConsecutiveFlag = 'x'
GROUP BY personID
它使用窗口功能按日期排序,并向后看两行。它将当前年份与前两行的值进行比较,如果差值为2,则我们知道我们有连续年份

外部查询筛选标记的记录并返回personid。

尝试:

select a.PersonID from Table a
left join Table b
    on a.Personid = b.Personid and a.year = b.year + 1
left join Table c
    on a.Personid = c.Personid and b.year = c.year + 1
where b.year is not null 
    and c.year is not null
    and a.year <= 1995 and c.year >= 1990

您可以将表与其自身连接起来:

declare @ConsecutiveYears as integer
set @ConsecutiveYears = 3

select distinct PersonYear.PersonID
from PersonYear
join PersonYear Consecutives
on PersonYear.PersonID = Consecutives.PersonID
    and Consecutives.Year between PersonYear.Year and PersonYear.Year + @ConsecutiveYears - 1
where PersonYear.Year >= 1990 and Consecutives.Year <= 1995
Group by PersonYear.PersonID, PersonYear.Year
Having COUNT(distinct Consecutives.Year) = @ConsecutiveYears
您可以使用2个自联接来完成此操作。您将在同一personId上联接表3次,并在每次联接中以1的增量递增一年,以查找每个人的顺序年份3次

模式:

查询:

输出:


您使用的是什么版本的sql server?谢谢,2012。添加了标签。太好了,如果是连续4年,接下来的部分会发生什么变化?2个前置和1个前置之间的行更改3个前置和1个前置之间的行=3实际上,您也可以执行3个前置和3个前置=3之间的行。由于它按年度排序窗口,我们在窗口中查看minyear,它将返回相同的结果。这假设表中没有重复的行,对吗?可能有重复的行。为了清楚起见,我更新了问题中的表格,增加了一个。对此答案的修改是否会导致重复?您可以不使用上面的表,而直接在子查询中分组,以获取窗口的不同值:从选择personID,从表中分组的年份,按1,2作为子查询,以替换从表I中快速更改答案。
create table tbl_so(PersonID int,[Year] int)
insert into tbl_so values
(1,          1991),
(1,          1992),
(1,          1993),
(1,          1993),
(2,          1990),
(2,          1991),
(3,          1991),
(3,          1992),
(3,          1994)
 select distinct t1.personId
 from tbl_so t1
 join tbl_so t2 on t1.[year]+1=t2.[year] and t1.personId=t2.personId
 join tbl_so t3 on t2.[year]+1=t3.[year] and t2.personId=t3.personId
personId
1