Suche Abfrage


#1

Hallo,

ich vereinfache das Problem kurz und zeige anhand folender Beispieltabelle was ich brauche. Meine Tabelle hat zwei Spalten Kundennummer und Objektnummer:

kdnr objnr
1     1
1     2
1     3
1     4
1     5
2     1
2     4
2     5
3     2
3     5

Ich suche jetzt diejenigen Kunden, die weniger als 4 (also <=3) verschiedene Objektnummern haben. Das wären in diesem Beispiel die Kunden 2 und 3. Schlussendlich möchte ich auch noch die Vereinigungsmenge über die Objekte dieser Kunden haben, sprich: 1,2,4,5. Irgendwie steh ich grad aufm Schlauch :confused:

Vielen Dank falls es jemand weiß.

Gruß


#2

EDIT: Ach sorry… in Zukunft sollte ich wohl genauer schauen, in welchen Forenbereich das geht :o… Hier geht’s um Java, also vergiss das… :

Es wäre hilfreich zu wissen, in welcher Form diese Daten bisher vorliegen. Und wie zeitkritisch das ganze ist (bzw. ob es um 100 oder 10000000 Einträge geht). Und ob die Nummern immer 1 bis n sind. Und ob die Nummern immer aufeinanderfolgend sind (also immer einzelne “Blöcke” mit Kunden dastehen, oder ob es auch sowas wie
1 123
2 234
1 345
2 456
sein könnte…)

Angenommen, es ist strukturell äquivalent zu zwei arrays,
int customers[n]
int objects[n]
Die die Kunden- und Objektnummern einfach aufgelistet enthalten. Angnommen, die Nummern sind nicht fortlaufend, und nicht aufeinanderfolgend. Dann könnte man das (wenn man es nicht ganz “sophisticated” mit einer eigenen “Kunde”-Klasse und so machen will) z.B. so machen:


// Map von KundenID -> ListeDerObjektIDs erstellen
Map<Integer, List<Integer>> map = new HashMap...();
for (int i=0; i<n; i++)
{
    List<Integer> list = map.get(customers**);
    if (list == null)
    {
        list = new ArrayList<Integer>();
        map.put(customers**, list);
    }
    list.add(objects**);
}

// Die sammeln, die weniger als 'max' Objekte haben
int max = 3;
Map<Integer, List<Integer>> relevant = new HashMap...();
for (int i=0; i<n; i++)
{
    List<Integer> list = map.get(customers**);
    if (list.size() <= max) relevant.put(customers**, list);
}
// (das könnte man effizienter machen - insbesondere könnte
// man diese Überprüfung schon beim Erstellen der ersten 
// map machen, wenn die Objekte aufeinanderfolgend sind -
// dann würde man die, die zu viele Objekte haben, gar nicht
// erst in die Map legen!)

// Vereinigung der Objekte bilden
Set<Integer> union = new HashSet<Integer>();
for (Integer c : relevant.keySet())
{
    union.addAll(relevant.get(c));
}
// (geschickter wäre ggf. direkt den EntrySet zu verwenden...
//  ... ist so nur schnell hingeschrieben...)


#3

ich versteh gerade nicht genau was du alles haben willst und wie genau, schreib am Besten mal deine Wunschergebnismenge hin

also den ersten Teil könntest du einfach mit
[sql]SELECT kdnr, COUNT(*) FROM tabelle GROUP BY kdnr;[/sql] (ungetestet aber müsste laufen)


#4

Hi Marco,

vielen Dank für deine ausführliche Antwort, leider suche ich einen Weg das mit SQL zu lösen, deswegen auch der Beitrag im Datenbankforum.

Dass ich es mit Java machen kann ist mir klar, aber ich suche eine schnelle SQL Abfrage.

Viele Grüße
Rev


#5

Ah Eagles Post übersehen! Danke das is genau das was ich suche, vielen Dank :slight_smile: