sql查询以获取至少相隔10天的不同日期

gkl3eglg  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(367)

我有一张由日期和名字组成的表格。我想按名称和日期对结果进行分组,条件是所选结果日期至少相隔10天(从该名称表中的第一个日期开始)
这是一个例子:

________________________
Names    |      Dates    
-----------------------
John     |      2-2-2000
________________________
John     |      5-2-2000
________________________
John     |      16-2-2000
________________________
John     |      17-2-2000
________________________
John     |      20-2-2000
________________________
John     |      31-2-2000
________________________
John     |      5-3-2000
________________________
John     |      14-3-2000
________________________

查询的输出应该是这些值的count之和(john,2-2-2000),(john,16-2-2000),(john,31-2-2000),(john,14-3-2000),即4。
如何在sql server中为此编写查询?

1l5u6lss

1l5u6lss1#

这有点棘手,因为您需要跟踪“拾取”的最后一行以选择下一行。这意味着您需要一种迭代过程,这反过来又意味着一个递归查询:

with 
    data as (
        select t.*, row_number() over(partition by names order by dates) rn
        from mytable t
    ),
    rcte as (
        select d.*, dates dates_base from data d where rn = 1
        union all
        select 
            d.*, 
            case when d.dates >= dateadd(day, 10, r.dates_base) then d.dates else r.dates_base end
        from rcte r
        inner join data d on d.rn = r.rn + 1 and d.names = r.names  
    )
select names, count(distinct dates_base) res from rcte group by names

db fiddlde上的演示:

names | res
:---- | --:
John  |   4
gv8xihay

gv8xihay2#

你的问题不清楚。与您期望的结果一致的还有,您希望计算与前一行的间隔为10天以上的行。为此,只需使用 lag() :

select count(*)
from (select t.*,
             lag(date) over (partition by name) as prev_date
      from t
     ) t
where prev_date is null or prev_date < dateadd(day, -10, date);

使用 select * 获取记录列表。

相关问题