Hallo zusammen,
ich habe in den letzten Tagen einige grössere Berechnungen durchführen müssen und bin dabei immer wieder auf folgendes Problem gestossen, welches ich trotz Nachfragen bei unserem Freund "Google" nicht wirklich lösen konnte.
In vereinfachter Weise möchte ich das Problem kurz schildern:
Es existiert eine Tabelle mit (unter anderem folgenden) Spalten:
- UserID (Jeder Nutzer einer Website hat eine eindeutige ID)
- BeitragID (jeder Newsflashbeitrag auf der Webseite hat eine eindeutige ID)
- Publikationsdatum des Beitrags
- Click-Time: Wann hat der User die entsprechende Ressource abgefragt
...
Die Spalte BeitragID ist für dieses Problem erst mal nicht relevant. Die Aufgabe besteht darin Clickstreams pro User und Publikationstagen zu berechnen. Ein Clickstream umfasst daher (nach dieser Definition nur Newsbeiträge eines Publikationstages, die Fragestellung erfordert dies - soll hier nicht weiter hinterfragt werden). Weiter gilt jedes Mal, wenn die Zeit zur vorangehenden Newsartikelabfrage > 10min ist als neuer Stream. Damit gibt es innerhalb jeder User & Publikationsdatum kombination möglicherweise mehrere Clickstreams.
Ich habe nun in Java ein Programm geschrieben, welches mir für jeden User und jeden Publikationstag eine Tabelle zurückgibt, auf welche anschliessend eine Funktion angewendet wird, um die User & Beitrag-Kombinationen einem Clickstream zuzuordnen. Diese Funktion trägt anschliessend in der Ursprungstabelle zwei neue Spaltenwerte ein (pro Entität):
- Anfang (=1=/ In der Mitte (=2)/ Ende eines Klickstreams (=3)
- Jeder Clickstream bekommt eine eindeutige ID zugeordnet, d.h. jede Entität bekommt also eine Clickstream-Nummer (ein Clickstream kann mehrere Newsflash&Userkombinationen umfassen). Dies erfordert also einige Vergleiche (Zeit oberhalb, Zeit unterhalb etc...)
Die veränderte Tabelle sieht dann so aus:
- UserID (Jeder Nutzer einer Website hat eine eindeutige ID)
- BeitragID (jeder Newsflashbeitrag auf der Webseite hat eine eindeutige ID)
- Publikationsdatum des Beitrags
- Click-Time: Wann hat der User die entsprechende Ressource abgefragt
- Anfang / Inside / Ende des Clickstreams
- Eindeutige Nummer für jeden Clickstream
Das Programm funktioniert, nur liegt das grosse Problem darin, dass die Tabelle sehr gross ist (über 140 000 Einträge) und die Ausführung zirka 10 Stunden dauert. Ist leider nicht wirklich akzeptabel so, da ich diesen Vorgang relativ häufig wiederholen muss. Verglichen mit normalen SQL Abfragen direkt im Microsoft SQL Server (welche maximal einige Sekunden dauern) dauert der Umweg über das Java-Programm unglaublich lang.
Daher meine Frage:
- Gibt es eine Möglichkeit solche Abfragen in MS SQL zu programmieren?
for (UserID, min BIS UserID, max) {
for(Publikationstag, min BIS Publikationstag, max) {
--Gib mir die Tabelle zurück, die genau der UserID und dem Publikationstag entspricht und führe darauf Berechnungen durch und speichere diese in der Ursprungstabelle)
}
}
Denke, dass solche dynamische Abfragen in der Realität relativ häufig zum Einsatz kommen, und kann mir nicht vorstellen, dass es keinen besseren Weg gibt....
????
Über eine Hilfestellung würde ich mich sehr freuen.
Vielen Dank
Barbara
ich habe in den letzten Tagen einige grössere Berechnungen durchführen müssen und bin dabei immer wieder auf folgendes Problem gestossen, welches ich trotz Nachfragen bei unserem Freund "Google" nicht wirklich lösen konnte.
In vereinfachter Weise möchte ich das Problem kurz schildern:
Es existiert eine Tabelle mit (unter anderem folgenden) Spalten:
- UserID (Jeder Nutzer einer Website hat eine eindeutige ID)
- BeitragID (jeder Newsflashbeitrag auf der Webseite hat eine eindeutige ID)
- Publikationsdatum des Beitrags
- Click-Time: Wann hat der User die entsprechende Ressource abgefragt
...
Die Spalte BeitragID ist für dieses Problem erst mal nicht relevant. Die Aufgabe besteht darin Clickstreams pro User und Publikationstagen zu berechnen. Ein Clickstream umfasst daher (nach dieser Definition nur Newsbeiträge eines Publikationstages, die Fragestellung erfordert dies - soll hier nicht weiter hinterfragt werden). Weiter gilt jedes Mal, wenn die Zeit zur vorangehenden Newsartikelabfrage > 10min ist als neuer Stream. Damit gibt es innerhalb jeder User & Publikationsdatum kombination möglicherweise mehrere Clickstreams.
Ich habe nun in Java ein Programm geschrieben, welches mir für jeden User und jeden Publikationstag eine Tabelle zurückgibt, auf welche anschliessend eine Funktion angewendet wird, um die User & Beitrag-Kombinationen einem Clickstream zuzuordnen. Diese Funktion trägt anschliessend in der Ursprungstabelle zwei neue Spaltenwerte ein (pro Entität):
- Anfang (=1=/ In der Mitte (=2)/ Ende eines Klickstreams (=3)
- Jeder Clickstream bekommt eine eindeutige ID zugeordnet, d.h. jede Entität bekommt also eine Clickstream-Nummer (ein Clickstream kann mehrere Newsflash&Userkombinationen umfassen). Dies erfordert also einige Vergleiche (Zeit oberhalb, Zeit unterhalb etc...)
Die veränderte Tabelle sieht dann so aus:
- UserID (Jeder Nutzer einer Website hat eine eindeutige ID)
- BeitragID (jeder Newsflashbeitrag auf der Webseite hat eine eindeutige ID)
- Publikationsdatum des Beitrags
- Click-Time: Wann hat der User die entsprechende Ressource abgefragt
- Anfang / Inside / Ende des Clickstreams
- Eindeutige Nummer für jeden Clickstream
Das Programm funktioniert, nur liegt das grosse Problem darin, dass die Tabelle sehr gross ist (über 140 000 Einträge) und die Ausführung zirka 10 Stunden dauert. Ist leider nicht wirklich akzeptabel so, da ich diesen Vorgang relativ häufig wiederholen muss. Verglichen mit normalen SQL Abfragen direkt im Microsoft SQL Server (welche maximal einige Sekunden dauern) dauert der Umweg über das Java-Programm unglaublich lang.
Daher meine Frage:
- Gibt es eine Möglichkeit solche Abfragen in MS SQL zu programmieren?
for (UserID, min BIS UserID, max) {
for(Publikationstag, min BIS Publikationstag, max) {
--Gib mir die Tabelle zurück, die genau der UserID und dem Publikationstag entspricht und führe darauf Berechnungen durch und speichere diese in der Ursprungstabelle)
}
}
Denke, dass solche dynamische Abfragen in der Realität relativ häufig zum Einsatz kommen, und kann mir nicht vorstellen, dass es keinen besseren Weg gibt....
????
Über eine Hilfestellung würde ich mich sehr freuen.
Vielen Dank
Barbara
Comment