SQlite3 mehrere Elemente Grupieren ?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
McAce
User
Beiträge: 32
Registriert: Dienstag 20. April 2010, 14:01

Hi
ich stehe vor folgendem Problem, meine Datenbank sieht ca. so aus
drei Spalten inklusive der ROWID jetzt möchte ich nur die Zeile ausgeben
in der die RROWID die hoechset Zahl und die Elemente in S2 und die Elemente in S1 gleich sind.

S1 S2
1 a "A"
2 a "A"
3 b "A"
4 b "A"
5 a "B"
.
.
.

in diesem Fall wäre die Ausgabe 2 a "A"

Wenn ich mich nur auf eine Spalte beschränke bekomme ich das hin aber nicht bei zwei Spalten.

McAce
Zuletzt geändert von McAce am Freitag 3. Juni 2011, 14:48, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie sieht denn deine bisherige Query aus? ;-)
(Für tabellarische Daten verwende doch allgemeine Code-Tags; dann verrutscht auch nix)

Ich sehe da übrigens keine Gleichheit; wobei ich mich zusätzlich wundere, dass in der S1-Spalte Zeichen ohne Anführungsstriche in der Tabelle stehen - oder ist das nur Bequemlichkeit von Dir?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Zarolgil
User
Beiträge: 2
Registriert: Dienstag 21. Juni 2011, 08:52
Wohnort: Hamburg

Hi,

ich weiß nicht, ob es noch aktuell ist, aber hier mal die Lösung:

SELECT max(rowid) AS MaxRowID
FROM [hier_deinen_tabellennamen_einfügen]
WHERE S1 = S2

Allerdings sind in deiner Beispieltabelle S1 und S2 nirgends gleich, weil a <> A, wenn ich mal davon ausgehe das auch "a" ein String sein soll. Wenn Groß- oder Kleinschreibung ignoriert werden soll, einfach WHERE UCASE(S1) = UCASE(S2) einfügen.

Grüße
Der alte Teich / Ein Frosch springt hinein / Vom Wasser ein Geräusch (Matsuo Basho)
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Zarolgil hat geschrieben:Allerdings sind in deiner Beispieltabelle S1 und S2 nirgends gleich, weil a <> A, wenn ich mal davon ausgehe das auch "a" ein String sein soll. Wenn Groß- oder Kleinschreibung ignoriert werden soll, einfach WHERE UCASE(S1) = UCASE(S2) einfügen.
Du hast die Fragestellung nicht genau verstanden. Es ging darum, dass in unterschiedlichen Zeilen jeweils S1 und jeweils S2 identisch sind. Anders ausgedrückt soll der komplette dargestellte Datensatz bis auf die ROWID gleich sein.

Für mich sieht das ganze eher nach einem Subselect mit GROUP BY aus und wenn nur mehrfach vorhandene Zeilen berücksichtigt werden sollen, dann müsste man auch noch ein HAVING COUNT ergänzen.

Gruß,
Matthias
Benutzeravatar
Zarolgil
User
Beiträge: 2
Registriert: Dienstag 21. Juni 2011, 08:52
Wohnort: Hamburg

/me hat geschrieben:Du hast die Fragestellung nicht genau verstanden. Es ging darum, dass in unterschiedlichen Zeilen jeweils S1 und jeweils S2 identisch sind. Anders ausgedrückt soll der komplette dargestellte Datensatz bis auf die ROWID gleich sein.

Für mich sieht das ganze eher nach einem Subselect mit GROUP BY aus und wenn nur mehrfach vorhandene Zeilen berücksichtigt werden sollen, dann müsste man auch noch ein HAVING COUNT ergänzen.

Gruß,
Matthias
Müsste dann das Ergebnis der Beispieltabelle nicht eigentlich 4 b "A" sein. Oder stehe ich jetzt komplett auf dem Schlauch?
Der alte Teich / Ein Frosch springt hinein / Vom Wasser ein Geräusch (Matsuo Basho)
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Zarolgil hat geschrieben:Müsste dann das Ergebnis der Beispieltabelle nicht eigentlich 4 b "A" sein. Oder stehe ich jetzt komplett auf dem Schlauch?
Die Beschreibung in der Frage ist mir persönlich da nicht eindeutig genug. Nehmen wir an, die Datenmenge sei wie folgt.

Code: Alles auswählen

ROWID  S1  S2
1       a   "A"
2       a   "A"
3       b   "A"
4       b   "A"
5       a   "B"
Ich würde dann folgendes Ergebnis erwarten:

Code: Alles auswählen

2       a   "A"
4       b   "A"
Wenn wirklich nur eine Zeile gefordert ist, dann muss man die MAX-Lösung mit GROUP BY und HAVING kombinieren.

In dem Fall habe ich allerdings den Verdacht, dass man da ein Problem zu lösen versucht, das man mit einem ungünstigen Datenmodell selber erzeugt hat.
McAce
User
Beiträge: 32
Registriert: Dienstag 20. April 2010, 14:01

so ein mist irgendwie ahbe ich die Benachrichtigungsemail nicht erhalten.

Es ging nicht darum S1 mit S2 zu vergleichen es ging darum die Zeile zu finden in der z.B
alle gleichen Elemente von S1 und alle gleichen Elemente von S2 enthalten und die rowid die höchste
Zahl hat.
habe das Problem aber mittlerweile gelöst, es klappte nicht weil an anderer Stelle etwas fehl lief ;-)

Der Code sieht so aus

Code: Alles auswählen

auswahl = "SELECT FROM datenbank  WHERE (S1 || ROWID || S2) IN (SELECT S1 || MAX(ROWID)|| S2 FROM datenbank GROUP BY S1 || S2)"
Grüße McAce
Antworten