Tool zum Erstellen von Kombinationen - Verständnisfrage

O

onetimeuser

Gast
Hallo zusammen,

ich habe da mal eine Verständnisfrage, da ich keinerlei Aktien in Programmieren habe. Wenn die Frage hier nicht richtig platziert ist, dann bitte entsprechend verschieben.

Angenommen ich habe eine SQL Datenbank mit einer Tabelle die aus 30 Zeilen und 50 Spalten besteht. In jeder Zelle steht entweder der Wert 1 oder 0 und ich möchte wissen bzw. über ein kleines Tool abfragen, wie oft bzw. ob sich eine oder mehrere 10er Kombination(en) wiederholt hat/haben, wo der Wert derselben Spalten immer die 1 war.

Also bspw. wenn in Zeile 1, 5, 21 und 30 genau dieselben 10 Spalten den Wert 1 aufweisen, dann soll das Tool die entsprechenden Zeilen und Spalten ausspucken.

Mir geht es erstmal nur darum überhaupt zu verstehen, ob das ein irrer Aufwand wäre oder das noch überschaubar ist, da ich es sowieso von jemand anderem Programmieren lassen müsste.

Danke vorab!
 
Müsste das nicht mit Select gehen? Mein SQL kurs ist schon ne Weile her XD

Btw:
onetimeuser schrieb:
Aktien in Programmieren

Coole Sache
 
Um eine exakte Aussage zu machen sind es leider zu wenige Informationen:
  • sind es immer die gleichen Spalten die du vergleichen willst?
  • ist es immer der Wert 1 um den es dir geht?


Um wirklich flexibel zu sein reicht SQL hier wahrscheinlich nicht, das heißt du musst all Daten laden "select * from table;" was bis zu mehreren Millionen Einträgen auf heutigen Rechnern kein Problem ist.

Das machst du in der Programmiersprache (Anfängertauglich sind Skriptsprachen) deiner Wahl und in dieser Programmiersprache schreibst du auch das Programm.

Ich würde in eine Map (Abbildung von Schlüssel auf Liste von Einträgen) schreiben wobei der Schlüssel z.B. einfach eine Zeichenfolge ist "00101011" was anzeigt in welcher Spalte ein 1 ist - eine Map hat jeden Schlüssel nur ein mal. Ein Eintrag in der Map wäre dann z.B.
"00101011" -> 1,5,7 letzteres sind die Zeilen aus der Tabelle. Praktisch solltest nicht nur die Zeilennummer speichern sondern gleich die ganze Zeile - hast sie eh schon im Speicher.

Wenn du bei 0 anfängst:

  • Skriptsprache suchen die einfach ist z.B. Python
  • mit dieser Sprache die Tabelle in den Speicher lesen
  • versuchen einzelnen Zeilen auszugeben oder alle
  • die Einsen in jeder Zeile erkennen
  • die Einträge in einer Map speichern

An sich eine gute Aufgabe um in eine Sprache reinzukommen
 
Ginge sicherlich. Naiver Ansatz: du verjoinst die Tabelle mit sich selber. Die Join-Bedingung (verUNDete Prüfungen auf 1) lässt du durch irgendwas außerhalb der Datenbank aus den Spalten, an denen eine 1 stehen soll, generieren. Oder du ziehst den Krempel im Ganzen aus der Datenbank und machst es direkt im Code.
 
Erstmal Danke für die Antworten, bin mir allerdings nicht sicher, ob die Anforderung richtig rüber kam. Ich versuche es nochmal anhand eines kleineren Beispiels zu erklären. Sagen wir die Tabelle hat 5 Zeilen und 10 Spalten. Ziel ist eine 3er Kombination innerhalb der Zeile, die aber genau in der Form auch noch in weiteren Zeilen vorkommt:

ABCDEFGHIJ
10111010101
21101100011
31110111000
40110010001
51001111111

In diesem Beispiel hätte ich also eine 3er Kombination, die sich 1x wiederholt hat (gibt noch mehr, habe jetzt exemplarisch nur diese eine hervorgehoben). Es sollen aber nicht immer statisch bestimmte Spalten ausgelesen werden, sondern das sollte komplett dynamisch sein. Es müsste also eine Logik dahinter stecken, die eben automatisiert alle Zeilen und Spalten durchgeht, diese Kombinationen findet und ausspuckt.
 
Zuletzt bearbeitet von einem Moderator:
Spontan beim ersten Lesen (möglicherweise verbesserungswürdig):
  • Jede Zeile ist eine 50-bit Zahl.
  • Aus der ersten Zeile wird mit den gesetzten (gesuchten) 1en eine "Maske" gebaut (alles andere NULL)
  • mit der Maske wird ein bitweises AND auf alle anderen Zeilen gemacht (je 50-Bit Zahl)
  • Wo das Maske AND Zeile == Maske - true, sonst false

my € 0,02
 
  • Gefällt mir
Reaktionen: BAGZZlash
@blöderidiot Es gibt ja keine speziellen gesuchten Spalten. Trotzdem würde ich das ganz ähnlich angehen.
  • Im ersten Schritt jede Zeile mit jeder anderen ver-und-en (bei 30 Zeilen sind das also 435 Vorgänge)
  • Jedes Mal, wenn mindestens 10 Einträge aus einem solchen Vergleich übrig bleiben, habe ich schon mal eine gesuchte Kombination gefunden. Je nach dem, wie die genauen Anforderungen sind, würde ich es mir sparen, bei mehr als 10 gleichen Spalten alle Kombinationen von 10 gleichen Spalten aufzuzählen (wenn alle 50 Spalten eine 1 haben, wären das hier ja allein schon 50 nCr 10 = 30 Milliarden Kombinationen).
  • Im zweiten Schritt würde ich gefundene einmalige Wiederholungen mit jeweils einer weiteren Zeile ver-und-en
  • Dann immer weiter noch eine Ebene mehr ver-und-en.
Solange tatsächlich nicht allzu viele Treffer auftreten, sollte das auch nicht ewig lange dauern.
 
Vielen Dank für die Antworten, das hilft mir auf jeden Fall schon mal weiter bzw. damit habe ich einen Ansatz. Danke nochmal!
 
Entweder du bildest, wie blöderidiot schon gesagt hat, einen Hash über alle Spalten und vergleichts diesen oder du machst ein GROUP BY über alle besagten Spalten mit einem HAVING COUNT(1) > 1.
 
group_by?
Ah, schrieb ja schon jemand. Geht sicherlich über mehrere Spalten, sonst eben zusammen klatschen vorher
 
Zurück
Oben