T-SQL中的重复值

时间:2018-01-29 16:16:58

标签: sql-server tsql

我已经搜索了我遇到的问题,但我似乎无法找到适合我需要的解决方案。我能够提出下面的代码,但它似乎无法正常工作。我得到了我正在寻找的重复匹配,但它也返回了很多单个匹配。电话栏代表电话号码,原因列是"原因"为了电话。我试图找到不止一次出现电话号码的地方以及接听电话的原因。

我正在使用的专栏:

  • 电话 - 电话号码
  • 原因 - 致电原因
  • columndate - 通话日期
  • 部门 - 哪个部门负责电话

代码:

SELECT 
    phone, reason, columndate 
FROM 
    atable
WHERE
    phone IN (SELECT phone  
              FROM atable
              WHERE columndate > '2017-10-01 00:00:00.000'
                AND columndate < '2018-01-01 00:00:00.000'
              GROUP BY phone  
              HAVING COUNT(*) >= 2)  
    AND department LIKE 'accounting' 

1 个答案:

答案 0 :(得分:2)

单个匹配可能是部门不同的地方,这个非常简单的例子:

Phone       Reason      Department      ColumnDate
----------------------------------------------------------
000000000   A Reason    Credit Control  2017-12-29 16:29
000000000   A Reason    Accounting      2017-12-29 16:29

您的子查询将返回000000000,因为2017-10-012018-01-01之间有2行

SELECT phone  
  FROM atable
  where columndate > '2017-10-01 00:00:00.000'
    and columndate < '2018-01-01 00:00:00.000'
  GROUP BY phone  
  HAVING count(*) >= 2 

因此,您的查询基本上是:

SELECT phone, reason, columndate 
FROM atable
WHERE Phone IN ('000000000')
and department like 'accounting' 

只返回一行。

由于外部查询上没有日期过滤器,因此您还有可能返回原始日期范围之外的其他记录。

我认为你可以在一个带窗口函数的查询中完成所有这些:

SELECT  Phone, Reason, ColumnDate
FROM    (   SELECT  phone, 
                    reason, 
                    columndate,
                    Calls = COUNT(*) OVER(PARTITION BY phone)
            FROM    aTable
            WHERE   columndate > '2017-10-01 00:00:00.000'
            AND     columndate < '2018-01-01 00:00:00.000'
            AND     Department LIKE 'accounting' 
        ) AS t
WHERE   t.Calls >= 2;