2016-04-20 5 views
0

Ich muss Daten aus einer Tabelle zurückziehen, in der eine Spalte übereinstimmende Elemente enthält. Das habe ich bisher und es scheint nicht zu funktionieren.Wie kann ich nur Datensätze zurückziehen, in denen die Spalte übereinstimmende Daten enthält?

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 

Dies ist eine Tabelle, die aus Änderungen besteht, die von Triggern ausgelöst werden. Ich muss in der Lage sein, diese Tabelle abzufragen und alle Elemente zurückzunehmen, die in den Kriterien übereinstimmen.

Hier wäre ein Beispiel für den

Tisch
instance | database | co | id | changedby | oldvalue | newvalue 
---------------------------------------------------------------- 
sql01 | 123  | abc | 01 | user1 | 1234 | 5678 

Es könnte täglich Millionen von dieser Art von Aufzeichnungen sein. Was ich zurückziehen muss, sind nur Zeilen, in denen newvalue in 4 oder mehr Zeilen identisch ist. Da diese Datenbank voll von persönlichen Informationen ist (ich arbeite für eine Firma, die sich mit Bankwesen beschäftigt), suche ich nach Zeilen, in denen Bankleitwege und Buchhaltung möglicherweise betrügerisch verändert wurden.

+0

zeigen Ihnen eine Tabelle der Ergebnisse, die Sie bekommen, und auch: Sie diese aus where Klausel entfernen sollte Spotte eine Tabelle deiner gewünschten Ergebnisse? –

+0

Bitte bearbeiten Sie Ihre Frage und geben Sie Beispieldaten und gewünschte Ergebnisse an, damit wir wissen, wonach Sie fragen. –

+0

Sie müssen näher auf "scheint nicht zu arbeiten". Sieht gut aus für mich. Ich wäre glücklich, diese feine Frage auszuführen, wenn ich eine DB wäre. – JNevill

Antwort

1

Sie können dies tun, mit Aggregat Fensterfunktion:

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

Hinweis:

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

das ist was ich brauchte. Danke! – BSanders

Verwandte Themen