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