我知道我们可以使用滞后函数来获取大于前一记录的30天的记录.

我有一个附加在图像as shown in image中的要求

第一行是开始,我使用该日期与连续的记录进行比较,一旦我找到一个记录&>=30天,我就需要获取该记录的日期并开始与连续的记录进行比较,直到我找到一个新的记录&>;=30天.

在结束后,这样做,我需要记录谁是30天间隔或空(第一个记录)

在SQL中,我们有什么方法可以实现这一点吗?

我try 使用LAG函数,但这将仅与前一条记录进行比较,这将导致从第一条记录起>=30天的记录被删除.

declare @Payment table 
(
    PersonId int
    , fromdate date
    , todate date
)
insert @Payment 
(PersonId, fromdate , todate )
values (1, '07/05/2014' , '07/06/2014' )
,(1, '07/15/2014' , '07/16/2014' )
,(1, '09/23/2014' , '09/24/2014')
,(1, '10/15/2014' , '10/16/2014')
,(1, '10/30/2014' , '10/31/2014')
,(2,  '07/20/2014' ,  '07/25/2014')
,(2, '08/20/2014' , '08/21/2014')
,(2, '09/21/2014' , '09/22/2014')

select * from @Payment

;with cte as
(select PersonId , fromdate , todate
       ,datediff(d
                ,  lag(todate) over (partition by PersonId order by fromdate)
                , fromdate)DaysSinceLastindex
 from @Payment )
select  PersonId , fromdate , todate , DaysSinceLastindex
from cte
where DaysSinceLastindex >= 30 or DaysSinceLastindex is null

预期输出如所附图像enter image description here所示

推荐答案

我理解您的问题,我们这里需要一个递归查询:

with 
    data as (
        select p.*, row_number() over(partition by personid order by fromdate) rn
        from @payment p
    ),
    rcte as (
        select d.*, todate as refdate from data d where rn = 1
        union all
        select d.*, 
            case when datediff(d, r.refdate, d.fromdate) < 30 then r.refdate else d.todate end
        from rcte r
        inner join data d on d.personid = r.personid and d.rn = r.rn + 1
    )
select * from rcte where refdate = todate order by personid, fromdate

第一个CTE列举了每个人的付款情况.然后,递归查询从第一笔付款开始,按顺序处理行,同时跟踪"参考"开始日期,并在其与当前记录的间隔超过30天时更改它.最后一步是只筛选每个组的"第一条"记录.

PersonId fromdate todate rn refdate
1 2014-07-05 2014-07-06 1 2014-07-06
1 2014-09-23 2014-09-24 3 2014-09-24
1 2014-10-30 2014-10-31 5 2014-10-31
2 2014-07-20 2014-07-25 1 2014-07-25
2 2014-09-21 2014-09-22 3 2014-09-22

fiddle

如果一个人可能有超过option (maxrecursion 0)笔付款,那么在您的查询末尾需要option (maxrecursion 0)笔.

Sql相关问答推荐

创建每小时重置的序列号

将SEMI JOIN、ANTI JOIN转换为非连接SQL

如何解决Error:operator is not unique:unknown—unknown在一个动态SQL查询?""""

我如何计算字母a出现的字符串的次数?

Postgres:对包含数字的字符串列表进行排序

从自定义日期和时间开始,每月具有给定状态的公司数量

UPDATE查询中的乐观锁

基于多参数的SQL Server条件过滤

每小时 Select 1行

Haystack针相交-在元素最多的Haystack中查找集合

统计PostgreSQL中前10个最大大小表的行数

存储过程太慢

每个分组最多 Select 最后 2 个值并并排显示它们

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

如何计算两个非周期性时间序列+分组的重叠持续时间

达到特定值时,从0开始累加求和

IN子句使用的表值用户定义函数参数

如何在 SQL Server 中将 -13422.8450 舍入到 -13422.84

具有日期时间条件的存储过程