如何查找两个不同日期字段SQL在一定时间间隔内是不是匹配?
Posted
技术标签:
【中文标题】如何查找两个不同日期字段SQL在一定时间间隔内是不是匹配?【英文标题】:How to find if there is a match in a certain time interval between two different date fields SQL?如何查找两个不同日期字段SQL在一定时间间隔内是否匹配? 【发布时间】:2020-01-09 10:12:53 【问题描述】:我的事实表中有一个列,它根据以下案例陈述定义供应商是旧的还是新的:
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 年,那么该供应商将被视为该月的“新供应商”。现在我想通过对供应商编号进行不同的计数来计算每个月的旧/新供应商的数量,这不是问题。最后一步很棘手,现在我想计算 12 个月内新/旧供应商的数量(如果在任何滞后的 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 个月期间的“新”供应商。
这就是结果的最终结果,但我希望它对于“旧”而言为零,因为注册日期和发票日期在该 12 个月期间匹配一次,对于 201910 的整个滚动 12 个月,它应该被视为新日期
我们非常感谢任何帮助、可能的方法或想法。
最好的问候, 红宝石
【问题讨论】:
你只想要 mdx 还是 sql 也可以?此外,您的 12 个月期间是如何定义的。我的意思是你得到类似 2 个变量 201811 和 201912 的东西吗? 感谢您的回复!任何一个都可以,我只是想找到一个可能的解决方案:) 【参考方案1】:首先在供应商级别聚合,然后在类型级别聚合:
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;
注意:我假设您的日期列采用某种晦涩的字符串格式,以便您的代码正常工作。否则,您应该使用适当的日期函数。
【讨论】:
【参考方案2】:SELECT COUNT(*) OVER () AS TotalCount
FROM Facts
WHERE Regdate BETWEEN(olddate, newdate) OR InvoiceDate BETWEEN(olddate, newdate)
GROUP BY
Supplier
上述查询将返回该时间段内的所有供应商,然后将它们分组。因此 COUNT(*) 将只包括唯一订阅者。
您可能想要更改 WHERE 子句,因为我不太明白您是如何获得 12 个月期限的。通常,如果您的 where 子句在该时间段内返回供应商(它们不必是唯一的),那么 group by 和 count 将处理其余部分。
【讨论】:
mdx 的原因是获得滚动 12 个月,即 201910 将是 (201811-201910) 和 201909 将是 (201810-201909) 等等。所以如果供应商在任何相关期间都是新的该时间段内的几个月,它不仅在匹配的那个月内,而且在整个期间都算作新的。以上是关于如何查找两个不同日期字段SQL在一定时间间隔内是不是匹配?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用间隔 1 分钟在两个日期之间将时间序列数据生成到 Oracle PL/SQL 中的表中?