【问题标题】:How to query records 60 days prior to today如何查询今天前60天的记录
【发布时间】:2021-04-22 03:56:57
【问题描述】:

我有一个场景,我需要在 2020 年 12 月 1 日识别唯一的销售人员。在该日期确定的那些人中,有多少销售人员在过去 60 天内销售过产品。

对 12/2/20 重复相同的过程,在这些销售人员中,有多少销售人员在 2020 年 12 月 2 日之前的前 60 天内销售过产品。依此类推,直到 21 年 3 月 31 日。我能够在一个日期或特定日期完成。 SQL 服务器中是否有一个 while 循环或类似的东西可以解决这个任务?

例子:

person      sold on     Prior 60 days Period (10/2/20 - 11/30/20)
Nancy       12/1/2020   Nancy
Henry       12/1/2020
Rany        12/1/2020   Rany

person      sold on     Prior 60 days Period (10/3/20 - 12/01/20)
Tom         12/2/2020
Mar         12/2/2020   Mar
Young       12/2/2020   Young

一天查询示例。这很乏味。

SELECT distinct
CONVERT(VARCHAR(10),date,101) AS date,
Person_id
into #test
FROM person
WHERE date >='12/1/20'
AND date <'12/2/20'

Select count (distinct a.Person_id) as ct
from #test a inner join person b
on Person_id= Person_id
and b.date>='10/2/20'
and b.date < '12/1/20'

【问题讨论】:

  • 感谢您提供的示例输出。您能否也提供源表的样本(模式和数据)?
  • @Ruud,我添加了我使用的示例查询。谢谢。

标签: sql sql-server tsql


【解决方案1】:

一种方法是使用日期列表,例如相关子查询。构造日期的一种简单方法(如果您没有日期表)是递归 CTE:

with dates as (
      select convert(date, '2020-12-01') as dte
      union all
      select dateadd(day, 1, dte)
      from dates
     )
select d.dte,
       (select count(distinct s.person)
        from sales s
        where s.sold_on <= d.dte and
              s.sold_on > dateadd(day, -60, d.dte)
      ) as cnt_sales_persons
from dates d
group by d.dte
option (maxrecursion 0);

【讨论】:

  • 谢谢戈登。我根据自己的意愿对其进行了一些扭曲,并且似乎可以正常工作。
  • @joe,如果它回答了您的问题,请将其标记为答案。以后会对其他人有所帮助。