2013-03-13 11 views
6

Jest to tabela pracuję z:Jak napisać zapytanie SQL, aby zidentyfikować zduplikowane wartości w określonym polu?

The table

Chciałbym zidentyfikować tylko ReviewIDs które mają zduplikowane identyfikatory pomniejszania o różnych parametrach.

Na przykład, na powyższym obrazku, Identyfikator recenzji 114 ma dwa różne identyfikatory parametrów, ale oba rekordy mają ten sam identyfikator odliczenia.

Dla moich celów ten rekord (ID recenzji 114) zawiera błąd. Nie powinno być dwóch lub więcej unikalnych identyfikatorów parametrów, które mają ten sam identyfikator odliczenia dla pojedynczego ID weryfikatora.

Chciałbym napisać zapytanie, aby zidentyfikować te typy rekordów, ale moje umiejętności SQL jeszcze tam nie są. Wsparcie?

Dzięki!

Aktualizacja 1: Używam TSQL (SQL Server 2008), czy to pomaga
Aktualizacja 2: Wyjście że szukam byłyby takie same jak na powyższym zdjęciu, minus wszelkie rekordy nie pasują do kryteriów, które opisałem.

Pozdrawiam!

+1

Tak więc, w tym obrazie, dwa 114 zapisy powinny być obecne, jak również 5 wystąpień review_id 124? – Ellesedil

+0

@Elesedil ma rację, rekordy 13 i 14 w tej tabeli pokazują dwa różne identyfikatory parametrów z tym samym identyfikatorem odliczenia, więc byłby to jeden z identyfikatorów Review, które chciałbym przechwycić. – jblue

Odpowiedz

6
SELECT * FROM table t1 INNER JOIN (
    SELECT review_id, deduction_id FROM table 
    GROUP BY review_id, deduction_id 
    HAVING COUNT(parameter_id) > 1 
) t2 ON t1.review_id = t2.review_id AND t1.deduction_id = t2.deduction_id; 

http://www.sqlfiddle.com/#!3/d858f/3

Jeśli jest to możliwe, aby mieć dokładne duplikaty i to jest ok, można zmodyfikować klauzuli HAVING COUNT (DISTINCT parameter_id).

+0

Ta odpowiedź dostarcza poprawnych wyników.Zawróciłem używając CTE sugerowanego przez Michaela L, ponieważ tabela na obrazie jest wynikiem jeszcze jedna kwerenda, ale ta odpowiedź dostarczyła mi tego, czego szukałem, bardzo dziękuję! – jblue

6
Select ReviewID, deduction_ID from Table 
Group By ReviewID, deduction_ID 
Having count(ReviewID) > 1 

http://www.sqlfiddle.com/#!3/6e113/3 ma Przykładem

+0

Nie ma nic do uwzględnienia dla parametru id_parametru, który jest niezbędny do ustalenia, czy parametr review_id jest błędny, czy nie. – Ellesedil

+0

Jeśli zrobiłeś, że 'Po liczeniu (DISTINCT ReviewID)> 1' wtedy wiesz, czy były dwa różne reviewId (a nie tylko ten sam wiele razy.) –

+0

@Elesedil, poprawne, ID parametru musi być wzięty pod konto Każdy identyfikator odliczenia jest unikalny i może być zastosowany tylko do pojedynczego parametru (ID) – jblue

3

Gdybym zrozumieć kryteria: Dla każdej kombinacji ReviewID i deduction_id można mieć tylko jedno parameter_id i chcesz kwerendę, która daje wynik bez z ReviewIDs które łamią te zasady (zamiast identyfikowania te wiersze, które robią) . Będzie to zrobić:

;WITH review_errors AS (
    SELECT ReviewID 
    FROM test 
    GROUP BY ReviewID,deduction_ID 
    HAVING COUNT(DISTINCT parameter_id) > 1 
) 
SELECT t.* 
FROM test t 
    LEFT JOIN review_errors r 
    ON t.ReviewID = r.ReviewID 
WHERE r.ReviewID IS NULL 

Aby wyjaśnić: review_errors jest common table expression (myślę o nim jako o nazwie sub-zapytania, które nie zaśmiecać głównego zapytanie). Wybiera identyfikatory ReviewID, które łamią kryteria. Po zakończeniu dołączania zaznacza wszystkie wiersze z lewej tabeli, niezależnie od tego, czy pasują do właściwej tabeli i tylko wiersze z prawej tabeli, które pasują do lewej tabeli. Wiersze, które nie pasują, będą miały wartości zerowe w kolumnach tabeli po prawej stronie. Podając WHERE r.ReviewID IS NULL, eliminujesz wiersze z lewej ręki, które pasują do prawej tabeli.

SQL Fiddle

+0

Myślę, że masz ją od tyłu, ponieważ OP wskazuje, że chce zidentyfikować rekordy, takie jak review_id 114, który jest nieprawidłowym rekordem. logika, którą napisałeś, wykluczasz wszystkie wystąpienia review_id, nawet jeśli ma kilka rekordów, które są "dobre" – Ellesedil

+0

Wystarczająco uczciwe - mogłem źle zrozumieć. To jest drobna modyfikacja i [h ere's SQL Fiddle] (http://www.sqlfiddle.com/#!3/4dc10/2) –

+0

Musisz też dołączyć na deduction_id. W przeciwnym razie możesz wybrać dobre rekordy z pliku review_id, który ma złe rekordy. Podoba mi się jednak CTE. – Ellesedil

Powiązane problemy