2017-05-04 3 views
0

Ich bin neu auf SQL und brauche Ihre Hilfe, um die unten zu erreichen, habe ich versucht mit Gruppen-und Zählfunktionen, aber ich bekomme alle Zeilen in der einzigartigen Gruppe, die dupliziert sind.SQL-Abfrage, um eindeutige Datensätze zu finden

Unten sind meine Quelldaten.

CDR_ID,TelephoneNo,Call_ID,call_Duration,Call_Plan 
543,xxx-23,12,12,500 
543,xxx-23,12,12,501 
543,xxx-23,12,12,510 
643,xxx-33,11,17,700 
343,xxx-33,11,17,700 
766,xxx-74,32,1,300 
766,xxx-74,32,1,300 
877,xxx-32,12,2,300 
877,xxx-32,12,2,300 
877,xxx-32,12,2,301 

Bitte beachten Sie: -die Quelle mehr Kombinationen von eindeutigen Datensatz hat, so dass, wenn ich das Zählen tue der einzigartige Satz nicht als Zählung erscheint = 1

Beispiel: - die unter Daten in Quelle haben 60 Datensätze für jede Kombination

877,xxx-32,12,2,300 -- 60 records 
877,xxx-32,12,2,301 -- 60 records 

ich die einzigartigen einzigartigen Aufzeichnungen zu bekommen versuchen, aber die doppelte Datensätze auch bekommen sind in

Nachfolgend finden Sie die Zeilen, die sollte in der einzigartigen Gruppe auftauchen. d.h., es wird mehrere call_Plans für die gleichen Kombinationen von CDR_ID, TelephoneNo, Call_ID, call_Duration geben. Ich möchte Aufzeichnungen lesen, für die es nur einen Anrufplan für jede einzelne Kombination von CDR_ID ist, Telefonnein, Call_ID, call_Duration,

CDR_ID,TelephoneNo,Call_ID,call_Duration,Call_Plan 
643,xxx-33,11,17,700 
343,xxx-33,11,17,700 
766,xxx-74,32,1,300 

Bitte Beratung zu diesem Thema.

Danke und Grüße

+2

Können Sie auch den Code bitte teilen, dass Sie bisher versucht haben, und nur Sie einen Hinweis geben versuchen, die 'COUNT' Funktion in SQL – Joby

Antwort

-3
Select *, count(CDR_ID) 
from table 
group by CDR_ID, TelephoneNo, Call_ID, call_Duration, Call_Plan 
having count(CDR_ID) = 1 
0

Grundsätzlich sollten Sie dies versuchen:

SELECT A.CDR_ID, A.TelephoneNo, A.Call_ID, A.call_Duration, A.Call_Plan 
FROM YOUR_TABLE A 
INNER JOIN (SELECT CDR_ID,TelephoneNo,Call_ID,call_Duration 
      FROM YOUR_TABLE 
      GROUP BY CDR_ID,TelephoneNo,Call_ID,call_Duration 
      HAVING COUNT(*)=1 
      ) B ON A.CDR_ID= B.CDR_ID AND A.TelephoneNo=B.TelephoneNo AND A.Call_ID=B.Call_ID AND A.call_Duration=B.call_Duration 

Sie können eine kürzere Abfrage tun Windows-Funktion COUNT (*) verwenden OVER ...

0


Below Abfrage liefert Ihnen das Ergebnis

SELECT CDR_ID,TelephoneNo,Call_ID,call_Duration,Call_Plan, COUNT(*) 
FROM TABLE_NAME GROUP BY CDR_ID,TelephoneNo,Call_ID,call_Duration,Call_Plan 
HAVING COUNT(*) < 2; 

Es gibt Ihnen auch die Zählung. Wenn nicht erforderlich, können Sie es entfernen.

+0

haben sich geändert, statt weniger als , größer als versehentlich angegeben –

1

komplexere Gruppierungen tun Sie auch eine Common Table Expression/Abgeleitete Tabelle zusammen mit Fensterfunktionen verwenden:

declare @t table(CDR_ID int,TelephoneNo nvarchar(20),Call_ID int,call_Duration int,Call_Plan int); 
insert into @t values (543,'xxx-23',12,12,500),(543,'xxx-23',12,12,501),(543,'xxx-23',12,12,510),(643,'xxx-33',11,17,700),(343,'xxx-33',11,17,700),(766,'xxx-74',32,1,300),(766,'xxx-74',32,1,300),(877,'xxx-32',12,2,300),(877,'xxx-32',12,2,300),(877,'xxx-32',12,2,301); 

with cte as 
(
select CDR_ID 
    ,TelephoneNo 
    ,Call_ID 
    ,call_Duration 
    ,Call_Plan 
    ,count(*) over (partition by CDR_ID,TelephoneNo,Call_ID,call_Duration) as c 
from (select distinct * from @t) a 
) 
select * 
from cte 
where c = 1; 

Ausgang:

+--------+-------------+---------+---------------+-----------+---+ 
| CDR_ID | TelephoneNo | Call_ID | call_Duration | Call_Plan | c | 
+--------+-------------+---------+---------------+-----------+---+ 
| 343 | xxx-33  |  11 |   17 |  700 | 1 | 
| 643 | xxx-33  |  11 |   17 |  700 | 1 | 
| 766 | xxx-74  |  32 |    1 |  300 | 1 | 
+--------+-------------+---------+---------------+-----------+---+ 
+0

In der Frage gibt es zwei Zeilen, in denen 'cdr_id = 766' aber nur eine dieser beiden Zeilen in Ihrem Code ist. – SqlZim

+0

@SqlZim Das ist, was ich bekomme, um die Frage zu beantworten, bevor mehrere Änderungen gemacht werden ... – iamdave

+1

Sie haben Recht, ich hätte die Bearbeitungsgeschichte überprüfen sollen. rextester demo http: // rextester.com/TGXR99743 für Ihre aktualisierte Antwort – SqlZim

1

mit not exists()

select distinct * 
from t 
where not exists (
    select 1 
    from t as i 
    where i.cdr_id = t.cdr_id 
    and i.telephoneno = t.telephoneno 
    and i.call_id = t.call_id 
    and i.call_duration = t.call_duration 
    and i.call_plan <> t.call_plan 
) 

rextester demo: http://rextester.com/RRNNE20636

kehrt:

+--------+-------------+---------+---------------+-----------+-----+ 
| cdr_id | TelephoneNo | Call_id | call_Duration | Call_Plan | cnt | 
+--------+-------------+---------+---------------+-----------+-----+ 
| 343 | xxx-33  |  11 |   17 |  700 | 1 | 
| 643 | xxx-33  |  11 |   17 |  700 | 1 | 
| 766 | xxx-74  |  32 |    1 |  300 | 1 | 
+--------+-------------+---------+---------------+-----------+-----+ 
Verwandte Themen