【发布时间】:2020-10-20 21:07:42
【问题描述】:
我正在做的是检查几个日期之间的间隔,如果与上一个非重复结果没有 14 天的间隔,则称结果为重复。
coldfusion 中的代码如下所示:
<cfset date_check = data.date_to_check />
<cfset counted = 1 />
<cfloop query="data" >
#dateformat( date_to_check )# <br>
<cfif abs( dateDiff('d', date_check , data.date_to_check ) ) gt 14 >
<cfset counted ++ />
<cfset date_check = data.date_to_check />
Not Duplicate
<cfelseif currentrow gt 1>
Duplicate
<cfelse>
Not Duplicate
</cfif>
</cfloop>
> #counted#
输出,例如:
19-Jan-18 Not Duplicate
16-Jan-18 Duplicate
21-Oct-16 Not Duplicate
12-Oct-16 Duplicate
06-Oct-16 Not Duplicate
22-Sep-16 Duplicate
09-Aug-16 Not Duplicate
11-Jul-16 Not Duplicate
> 5
我尝试使用外部应用并加入距当前行 14 天的下一行。但是这种方法的问题是,如果我有一个集群,它会“重置”每一行的日期,如下所示:
19-Jan-18 - not duplicate
16-Jan-18 - duplicate
10-Jan-18 - will give false duplicate ( compares itself to Jan 16 instead of Jan 19 )
对此的查询是这样的:
SELECT
count(*)
FROM @item T1
OUTER APPLY (
SELECT TOP 1 *
FROM @item T2
WHERE T2.[index] < T1.[index]
ORDER BY T2.[index] DESC) T
WHERE DATEDIFF(DAY, T.[date], T1.[date]) > 14
【问题讨论】:
-
这似乎是一个间隙和孤岛 SQL 问题,而不是一个 ColdFusion 问题。在 SQL 中解决可能会容易得多。特别是 2016 年。这似乎也可能受益于日历表/日期维度。但这似乎是一个 X-Y 问题。您的应用程序需要知道哪些是重复的,还是只关心在非重复之间进行比较?
-
@Shawn 我包含了冷融合解决方案(它确实给出了正确的结果)仅供参考,因为这是我目前执行计算的方式。我真正需要的答案的唯一部分是非重复项的计数,它将按我未包含在问题中的第三列分组。因为我正在处理的数据是相当静态的,所以我实际上不需要将其更改为 sql,只是出于好奇是否可以这样做。
标签: coldfusion sql-server-2016