如何只撤回列具有匹配数据的记录?

时间:2016-04-20 18:50:14

标签: sql sql-server-2012

我需要从列中具有匹配项的表中提取数据。这是我到目前为止所做的,似乎没有用。

SELECT 
    @@SERVERNAME AS Instance, 
    DB_NAME() AS [DataBase],
    co, id,
    changedBy,
    oldValue, newValue
FROM 
    Table1 T1
WHERE 
    CONVERT(DATE, changeDate) = CONVERT(DATE, GETDATE()) 
    AND column1 = 'name1'
    AND column2 IN ('name2','name3')
    AND (SELECT COUNT(*) FROM Table1 T2 WHERE T1.newValue = T2.newValue )>3

这是一个由触发器发生的变化组成的表。我需要能够查询此表并撤回符合条件的任何项目。

这是表

的一个例子
instance | database | co  | id | changedby | oldvalue | newvalue
----------------------------------------------------------------
sql01    |  123     | abc | 01 |  user1    |   1234   |    5678

每天可能有数百万种这类记录。我需要撤回的只是4行或更多行中newvalue相同的行。由于这个数据库充满了个人信息(我为一家处理银行业务的公司工作),我正在寻找银行路由和会计可能被欺诈性更改的行。

1 个答案:

答案 0 :(得分:1)

您可以使用聚合窗口函数执行此操作:

;with cte as(select *, count() over(partition by newvalue) as rn
             from table1 
             where ...)
select * 
from cte
where rn > 3

注意:您应该从where子句中删除它:

AND (SELECT COUNT(*) FROM Table1 T2 WHERE T1.newValue = T2.newValue )>3