如何查找两个不同日期字段 SQL 之间在特定时间间隔内是否存在匹配项?

How to find if there is a match in a certain time interval between two different date fields SQL?

我的事实 table 中有一列根据以下案例陈述定义供应商是旧供应商还是新供应商:

CASE
             WHEN (SUBSTRING([Reg date], 1, 6) = SUBSTRING([Invoice date], 1, 6) 
             THEN ('New supplier')
             ELSE('Old supplier')
END as [Old/New supplier]

因此,例如,如果供应商注册于 201910 并且发票日期为 201910,则该供应商将被视为该月的 'New supplier'。现在我想通过对 Supplier no 进行不同的计数来计算每个月 Old/New 供应商的数量,这不是问题。最后一步变得棘手,现在我想计算 12 个月内 New/Old 供应商的数量(如果在任何滞后的 12 个月中发票日期和注册日期匹配) .所以我创建了以下 mdx 表达式:

aggregate(parallelperiod([D Time].[Year-Month-Day].[Year],1,[D Time].[Year-Month-Day].currentmember).lead(1) : [D Time].[Year-Month-Day].currentmember ,[Measures].[Supplier No Distinct Count])

我面临的问题是它将计算供应商编号“1234”两次,因为它在那个时间段内既有新的也有旧的。我希望的是,如果它找到一个匹配项,它将被视为该 12 个月期间的 "New" 供应商。

这就是结果的最终结果,但我希望它在 "Old" 中为零,因为注册日期和发票日期在这 12 个月期间匹配一次,对于整个滚动 12 应该被视为新的201910 月

非常感谢任何帮助、可能的方法或想法。

此致, 规则

SELECT COUNT(*) OVER () AS TotalCount
FROM Facts
WHERE Regdate BETWEEN(olddate, newdate) OR InvoiceDate BETWEEN(olddate, newdate) 
GROUP BY
 Supplier

以上查询会return该时间段内的所有供应商,然后对他们进行分组。因此 COUNT(*) 将仅包括唯一订阅者。

您可能想更改 WHERE 子句,因为我不太明白您是如何获得 12 个月期限的。通常,如果您的 where 子句 return 是那个时间段内的供应商(他们不必是唯一的),那么 group by 和 count 将处理其余部分。

首先在供应商级别聚合,然后在类型级别聚合:

select type, count(*)
from (select supplierid,
             (case when min(substring(regdate, 1, 6)) = min(substring(invoicedate, 1, 6))
                   then 'new' else 'old'
              end) as type
      from t
      group by supplierid
     ) s
group by type;

注意:我假设您的日期列采用某种晦涩的字符串格式,以便您的代码正常工作。否则,您应该使用适当的日期函数。