Mehrfache Telefonnummer identifizieren

Mr. Robot

Fleissiger Benutzer
Beiträge
88
Hallo zusammen,

ich habe vermutlich eine einfache Frage zu der folgenden Tabelle:

DATUMHOTLINEANRUFNUMMERWas ich möchte
03.04.2023​
Zentrale
123​
03.04.2023​
Zentrale
123​
1​
03.04.2023​
Zentrale
4​
03.04.2023​
Zentrale
5​
03.04.2023​
Zentrale
6​
03.04.2023​
Zentrale
7​
03.04.2023​
Zentrale
8​
03.04.2023​
Zentrale
99​
03.04.2023​
Zentrale
99​
03.04.2023​
Zentrale
99​
1​
03.04.2023​
Zentrale
111​
03.04.2023​
Zentrale
111​
03.04.2023​
Zentrale
111​
1​


Ich möchte in dieser Tabelle die Anzahl der Wahlwiederholer identifizieren. Immer wenn eine Nummer mehrfach vorkommt soll die letzte Nummer eine 1 erhalten. Wenn ich die Summe drüber bilde hätte ich dann 3 als die Anzahl der Wahlwiederholer.

Ich habe es mit der WINDOW FUNCTION mit COUNT(), ROW_NUMBER(), RANK(), DENSE_RANK() versucht aber nicht das gewünschte abbilden können.

Jemand eine Idee? Wenn man bei folgender Abfrage dem MAX immer eine 1 zuordnen könnte und Rest eine 0 wäre es ja an sich schon gelöst:

,ROW_NUMBER() OVER
(PARTITION BY DATUM, HOTLINE, ANRUFNUMMER ORDER BY ANRUFNUMMER)
AS running_count

Gruß
Mr. Robot 🤖
 
Werbung:
da die ersten 3 Spalten bei dir immer gleich sind habe ich sie einfach mal weggelassen ...

Code:
postgres=# select * from robot ;
 nr  
-----
 123
 123
   4
   5
   6
   7
   8
  99
  99
  99
 111
 111
 111
(13 rows)

postgres=# with foo as (select *, row_number() over(partition by nr order by nr) from robot order by nr) select nr, max(row_number) from foo where row_number > 1 group by nr;
 nr  | max 
-----+-----
  99 |   3
 111 |   3
 123 |   2
(3 rows)

postgres=#
 
hi akretschmer,
danke für deine antwort. allerdings ist das nicht was ich suche. die tabelle soll genau so bestehen bleiben ohne agregation etc. ich brauche nur eine zusätzliche spalte mit den einsen. deine neue tabellen gibt zudem die anzahl der wiederholungen an aber nicht der wiederholer.
 
Vermutlich gibt es auch noch einen Zeitanteil der eindeutig ist?

Was ist denn wenn eine Nummer zwei mal am selben Tag gewählt wird, dazwischen aber eine Pause und vielleicht andere Nummern liegen. Soll das dann als Wahlwiederholung gelten oder erst bei Mehrfachwahl hintereinander weg?

Warum sind 99 und 111 erst beim dritten Mal eine Widerholung, 123 aber beim zweiten Mal?
 
Code:
postgres=# alter table robot add column id serial primary key;
ALTER TABLE
postgres=# select * from robot;
 nr  | id 
-----+----
 123 |  1
 123 |  2
   4 |  3
   5 |  4
   6 |  5
   7 |  6
   8 |  7
  99 |  8
  99 |  9
  99 | 10
 111 | 11
 111 | 12
 111 | 13
(13 rows)
postgres=# with foo as (select *, row_number() over(partition by nr order by nr, id) from robot order by nr), foo2 as (select * from foo where row_number > 1) select nr, max(id) as id from foo2 group by nr;
 nr  | id 
-----+----
  99 | 10
 111 | 13
 123 |  2
(3 rows)
 
Denke habe es jetzt auch ohne ID lösen können:

CASE WHEN ROW_NUMBER() OVER (PARTITION BY ANRUFERNUMMER ORDER BY ANRUFERNUMMER) > 1
AND ROW_NUMBER() OVER (PARTITION BY ANRUFERNUMMER ORDER BY ANRUFERNUMMER) = COUNT(ANRUFERNUMMER) OVER (PARTITION BY ANRUFERNUMMER) THEN 1
ELSE 0
END AS 'Was ich möchte'


@ukulele
Der Anrufer mit der Nr. 123 hat nur zweimal am ganzen Tag angerufen. Daher ein Wiederholer.
Der Anrufer mit der Nr. 99 oder 111 hat dreimal am ganzen tag angerufen. Daher jeweils ein Wiederholer.
 
Denke habe es jetzt auch ohne ID lösen können:
Hab nicht den Eindruck, dass der Order By Teil in der Partition Clause ausreichend ist. Rownumber() ist damit etwas beliebig oder? Reihenfolge wie dargestellt also nicht garantiert.
(Was aber für die bloße Bestimmung eines Wiederholers anhand der Nummer auch nicht relevant ist. )
 
er will offensichtlich den letzten Record vom Tag, wenn es mehrere Anrufe gab. Daher ist es auch Murks, das mit einer real existierenden Spalte zu machen, sondern passend auswerten (am Tag danach oder so).
 
Werbung:
Wenn dem so ist dann täte es auch ein Aggregat mit GROUP BY mit HAVING
Code:
SELET tabelle.*,t.was_ich_moechte
FROM tabelle
LEFT JOIN (
SELECT datum,anrufnummer,1 AS was_ich_moechte
FROM tabelle
GROUP BY datum,anrufnummer
HAVING count(*) > 1
) t ON tabelle.datum = t.datum AND tabelle.anrufnummer = t.anrufnummer
PS: Wenn es dann nur beim letzten Datensatz stehen soll dann muss man eben noch mit ROW_NUMBER() und PARTITION BY durchzählen und im Aggregat auch Zählen und das noch in die Join-Condition packen:
Code:
SELET tabelle.*,(CASE WHEN t.zaheler IS NOT NULL THEN 1 ELSE NULL END) AS was_ich_moechte
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY datum,anrufnummer ORDER BY datum/*zeit?*/ AS zaehler,*
FROM tabelle
) tabelle
LEFT JOIN (
SELECT datum,anrufnummer,count(*) AS zaehler
FROM tabelle
GROUP BY datum,anrufnummer
HAVING count(*) > 1
) t ON tabelle.datum = t.datum AND tabelle.anrufnummer = t.anrufnummer AND tabelle.zaehler = t.zaehler
Sry ist jetzt nur so hingerotzt :cool:
 
Zuletzt bearbeitet:
Zurück
Oben