【问题标题】:Can I perform the same functionality as this loop in sql?我可以在 sql 中执行与此循环相同的功能吗?
【发布时间】: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


【解决方案1】:

我认为 EXISTS 子查询是最直接的方法。如果这还不够性能,那么您可以为它做一个连接,但我发现 EXISTS 通常足够快并且更容易阅读。

 SELECT     ID,
            Name,
            Date_To_Check,
            CASE
                WHEN        EXISTS (
                                SELECT  1
                                FROM    Table1 b
                                WHERE   b.Date_To_Check < a.Date_To_Check
                                    AND DATEDIFF(d,b.Date_To_Check,a.Date_To_Check) <= 14
                            )
                    THEN    1
                ELSE        0
            END AS isDuplicate
 FROM       Table1 AS a

【讨论】:

    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2021-10-05
    • 2020-12-24
    • 2012-12-15
    • 2021-02-14
    相关资源
    最近更新 更多