我已经有了这个半工作版本,请参阅下面的SQL Fiddle:
http://sqlfiddle.com/#!6/74ab3/3
我使用的方法大多数情况下,但需要我构建和填充一个单独的日期表,我用它来连接回原始表。此外,一旦匹配记录日期,我目前正在使用它的方式
我正在寻找的是能够为已存在的每个COUNT
组合获得custid
groupid, cust_type, cust_date
个不同的cust_date
。计数应包括自身的日期范围和3个月(dateadd(m, 2, cust_date)
和COUNT
)。例如,2014年1月,它应包含2014年1月,2014年2月和2014年3月的独特{{1}}记录。
我希望找到一种不需要预先填充单独表格的方法。有什么想法吗?
答案 0 :(得分:0)
你可以尝试这样的事情SQL Fiddle
;WITH monthrange AS
(
SELECT 0 as mnth UNION ALL SELECT 1 UNION ALL SELECT 2
), recordrange AS
(
SELECT groupid,custid,cust_type,DATEADD(month,-mnth,cust_date) cust_date
FROM records cross join monthrange
)
SELECT DISTINCT d.groupid, d.cust_type, d.cust_date, COUNT(DISTINCT d.custid) as cust_count
FROM recordrange d
WHERE d.cust_date >= (SELECT MIN(cust_date) FROM records)
GROUP BY d.groupid, d.cust_type, d.cust_date
答案 1 :(得分:0)
怎么样:
with dat as (
select 1 line
, cast('2014-01-01' as date) date_min
, cast('2014-03-01' as date) date_max
union all
select line + 1
, dateadd(month,1,date_min)
, dateadd(month,1,date_max)
from dat where line<12
)
select d.groupid, d.cust_type, dt.date_min, dt.date_max
, count(distinct custid) as cust_count
from records d
join dat dt on d.cust_date between dt.date_min and dt.date_max
group by d.groupid, d.cust_type, dt.date_min, dt.date_max;