For schleife mit sql

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
janedoe

For schleife mit sql

Beitrag von janedoe »

hallo.

ich versuche jetzt schon seit einiger Zeit eine for-Schleife zu basteln, die leider so gar nicht funktioniert. Ich habe eine datenbank und möchte nur werte rauslesen, die ein bestimmtes kriterium erfüllen, in diesem Fall phi.

Code: Alles auswählen

for (phi in 45:60){
d <- dbGetQuery(con, 'SELECT datum, phi FROM data WHERE P = phi')}
Als Fehlermeldung bekomme ich, dass es phi nicht gibt.

Code: Alles auswählen

Fehler in rsqlite_send_query(conn@ptr, statement) : no such column: phi
Danke.
Jani
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: For schleife mit sql

Beitrag von jogo »

Hallo Jani,
janedoe hat geschrieben: Do Jul 27, 2017 11:54 am

Code: Alles auswählen

for (phi in 45:60){
d <- dbGetQuery(con, 'SELECT datum, phi FROM data WHERE P = phi')}
Als Fehlermeldung bekomme ich, dass es phi nicht gibt.

Code: Alles auswählen

Fehler in rsqlite_send_query(conn@ptr, statement) : no such column: phi
das ist klar: phi ist ein Objekt in der R-Umgebung. Deine Datenbank kennt es nicht. Wenn Du so etwas willst, dann muss es so sein:

Code: Alles auswählen

dbGetQuery(con, paste0('SELECT datum, P FROM data WHERE P = ', phi))
pder

Code: Alles auswählen

dbGetQuery(con, paste0('SELECT datum, P as phi FROM data WHERE P = ', phi))
oder

Code: Alles auswählen

dbGetQuery(con, paste0('SELECT datum, P phi FROM data WHERE P = ', phi))
(je nach SQL-Dialekt)
Anmerkung zum Algorithmus:
Du durchläufst die Schleife mit Werte 45, 46, ..., 60 für phi
Bei jedem Mal wird d überschrieben.
Nach Durchlaufen der Schleife ist in d nur das letzte Ergebnis.
:!: Das möchtest Du mit Sicherheit nicht :!:
Nun könnte man das mit lapply() richtigstellen, aber in Deinem Fall solltest Du die SQL-Lösung verwenden:

Code: Alles auswählen

... WHERE P >= 45 and P<=60
... vielleicht kennt Deine Datenbank ein Konstrukt namens BETWEEN ...
https://www.tutorialspoint.com/sqlite/s ... rators.htm

Gruß, Jörg
janedoe

Re: For schleife mit sql

Beitrag von janedoe »

Hallo Jörg,

vielen Dank für deine Antwort. Dann probiere ich das noch mit P < und >. Dazu hätte ich noch eine Frage: die Ps sind bei mir keine ganzen Zahlen , sie variieren zwischen 48,14 und 59,89, ist das für die Abfrage egal, oder muss ich zusätzlich etwas berücksichtigen? Die AND Bedingungen kann ich auch beliebig erweitern? Zb hätte ich noch eine weitere Bedingung, über die ich die Einschränkung machen kann, das wäre die Bedingung "Land" oder "Wasser". Dabei handelt es sich um CHR, muss ich diese Bedingung dann in Anführungszeichen setzten? (okay, vielleicht doch mehr als eine Frage :shock: )

Code: Alles auswählen

d <-dbGetQuery(con, paste0('SELECT datum, P phi FROM data WHERE Tag IN ("20110127") AND surface  = "Land" AND WHERE P > 48 AND P < 60'))
glg jani
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: For schleife mit sql

Beitrag von jogo »

janedoe hat geschrieben: Do Jul 27, 2017 3:53 pmDazu hätte ich noch eine Frage: die Ps sind bei mir keine ganzen Zahlen , sie variieren zwischen 48,14 und 59,89, ist das für die Abfrage egal, oder muss ich zusätzlich etwas berücksichtigen?
Dann hätte das mit Deiner for-Schleife ohnehin nicht funktioniert, da Du ja dort auf Gleichheit getestet hättest. Die Gleichheit wäre sehr selten gegeben, also z.B. dass der Wert in Spalte P exakt 47 ist.
Die AND Bedingungen kann ich auch beliebig erweitern? Zb hätte ich noch eine weitere Bedingung, über die ich die Einschränkung machen kann, das wäre die Bedingung "Land" oder "Wasser". Dabei handelt es sich um CHR, muss ich diese Bedingung dann in Anführungszeichen setzten? (okay, vielleicht doch mehr als eine Frage :shock: )
ja, die WHERE-Klausel darf recht lang werden. ja, character-Spalten sind gegebenenfalls mit Zeichenkettenkonstanten zu vergleichen.
:!: Wie Edi schon schrieb: Dies alles sind keine Fragen zu R sondern zu SQL. :!: viewtopic.php?f=7&t=496&p=1936#p1921
Bitte beschäftige Dich ein wenig mit der Datenbank, die Du verwendest.

Code: Alles auswählen

d <-dbGetQuery(con, paste0('SELECT datum, P phi FROM data WHERE Tag IN ("20110127") AND surface  = "Land" AND WHERE P > 48 AND P < 60'))
wozu soll hier das paste0(...) gut sein?

Gruß, Jörg
Antworten