Zum Forum springen
Benachrichtigungen
Alles löschen

SQL

6 Beiträge
4 Benutzer
0 Reactions
699 Ansichten

Es liegt eine eher schlecht strukturierte Datenbank vor an der ich auch nichts ändern kann.

Beispiel Table

ID  |  key  |  val
---------------------
  1  |  1  | 5
  2  |  2  | 1
  3  |  2  | 2 
  4  |  1  | 7
  5  |  3  | 1
  6  |  1  | 2
  7  |  3  | 1
  8  |  3  | 9
  9  |  2  | 4
 10  |  1  | 4
 11  |  1  | 7
 12  |  2  | 3
 13  |  4  | 4
 14  |  4  | 2

Wie bekomme ich alle Zeilen mit einem bestimmten Offset aber gruppiert durch die Spalte key.

Nehmen wir an, ich möchte alle Zeilen bis auf die ersten 2 eines jeden keys wobei nach val ASC geordnet wird, sprich:

ID  |  key  |  val
---------------------
  1  |  1  | 5
  4  |  1  | 7
 11  |  1  | 7
 12  |  2  | 3
  9  |  2  | 4
  8  |  3  | 9

Für key 4 gibt es kein Ergebnis da nur 2 Einträge mit diesem Key.


Antwort
Zitat
5 Antworten
flowIIpoker
Beigetreten: 14.02.2007

also im mysql wuerd ich mal dieses group by versuchen
moeglicherweise hab ich aber auch die aufgabenstellung misverstanden

edit:
ist natuerlich nicht zielfuehrend

erschlagen wird ich das eher in einer programmiersprache, obwohl es sicher auch ueber ein script loesen laesst


Antwort
Zitat
Heistermeister
Beigetreten: 13.11.2011

keine ahnung ob das so läuft
ok ich glaube das ist voll der schwachsinn aber ich schätze du musst irgendwie mit limit arbeiten

select * from Tabelle where key =
(select * from Tabelle where key = 1 limit 1, 100 order key by asc)
or
(select * from Tabelle where key = 2 limit 1, 100 order key by asc)
or
(select * from Tabelle where key = 3 limit 1, 100 order key by asc)
or
(select * from Tabelle where key = 4 limit 1, 100 order key by asc)


Antwort
Zitat

Wie man an der Frage sieht bin ich definitiv kein SQL-Spezi und der Großteil ist auch in C++. Allerdings wäre hier eine Komplettlösung in SQL optimal, das die Ergebnisse direkt aus der DB gelöscht werden sollen. SQl-Server und Host für das Programm sind unterschiedliche Rechner und daher will ich die Kommunikation minimal halten.

Im Endeffekt habe ich es über einen Join des Tables mit sich selbst gemacht und wobei die Ordnung durch t1.val > t2.val und eine Gruppierung erreicht wird. Count(*) gibt dann den Rang der Row an.

Problematisch ist einfach das exponentielle Verhalten bei mehreren Millionen Rows. Muss es daher in Einheiten partitionieren, die vom Zeitaufwand erträglich sind und gleichzeitig nicht zu viele Anfragen darstellen.

Falls doch noch jemand einen besseren Weg hat her damit.


Antwort
Zitat
Speedy84
Beigetreten: 12.02.2007

Wenn du datenbankseitig bleiben möchtest, schau dir mal PL/SQL an. Updates nicht in zu grossen Paketen durchführen, sonst kann dir bei mehreren Millionen Datensätzen schnell das Transaktionslog volllaufen. Und nachher auf Fragmentierung der Indizes / Statistiken achten.


Antwort
Zitat
Speedy84
Beigetreten: 12.02.2007

Und, wie lief es?


Antwort
Zitat