getQuery mit zwei bedingungen

... zu anderer statistischer Software, zu Datenbanken und Programmiersprachen.

Moderatoren: EDi, jogo

jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

getQuery mit zwei bedingungen

Beitrag von jessi »

Hey zusammen,

ich habe Daten aus einer sqlDB ein- bzw. ausgelesen. Für einen Parameter hat das mal funktioniert.

Code: Alles auswählen

vO <- dbGetQuery(con, 'SELECT v FROM data WHERE "Ort" = :x', params = list(x = seq(46.0,53.45)))
Jetzt möchte ich gerne eine weitere Bedingung stellen und zwar dass v Werte zwischen 12 und 25 annimmt. In google bin ich auf den AND-Operator gestoßen, konnte aber leider keine Informationen finden, wie ich diesen in Verbindung mit params verwende.

Versucht hätte ich es mal so, dass ich einfach den AND-Operatur als zusätzlich Bedingung angebe, leider hat das aber nicht funktioniert.

Code: Alles auswählen

vO_12_25<- dbGetQuery(con, SELECT v FROM data WHERE "Ort" = :x, params = list(x = seq(46.0,53.45)) AND "wind" =:y, params = list(y = seq(12,25)))
Kann ich den AND-Operator für zwei oder mehr Bedingungen in Verbindung mit params überhaupt verwenden oder brauche ich dazu eine andere Einlese-Routine?

LG. jess
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: getQuery mit zwei bedingungen

Beitrag von jogo »

Hallo Jessi,

willkommen im Forum. Deine Frage betrifft eher die korrekte Syntax der SQL-Abfrage.
Du müsstest also eher die Dokumentation des verwendeten Datenbanksystems befragen.
Liefert denn

Code: Alles auswählen

vO_12_25<- dbGetQuery(con, SELECT v FROM data WHERE "Ort" = :x, params = list(x = seq(46.0,53.45)) AND "wind" =:y, params = list(y = seq(12,25)))
irgendwelche Fehlermeldungen?
ich hätte ja vermutet, dass die Abfrage so aussehen könnten:

Code: Alles auswählen

vO_12_25<- dbGetQuery(con, 'SELECT v FROM data WHERE "Ort" = :x AND "wind" =:y', params = list(x = seq(46.0,53.45), y = seq(12,25)) 
BTW:
ich kann die Funktion dbGetQuery() nicht finden. Zu welchem Paket gehört diese?

und noch eine Nachfrage, Dein Parameter x hat den Wert:

Code: Alles auswählen

> seq(46.0,53.45)
[1] 46 47 48 49 50 51 52 53
Ist das richtig in Zusammenhang mit Deiner SQL-Abfrage?

Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: getQuery mit zwei bedingungen

Beitrag von jessi »

Hallo Jörg,

vielen Dank für deine Antwort. Ich habs jetzt mal so gelöst:

Code: Alles auswählen

vO <- dbGetQuery(con, 'SELECT v FROM data WHERE "Ort" IN (46, 53.45) AND "wind" IN  (12, 25)')
LG. Jessi
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: getQuery mit zwei bedingungen

Beitrag von jessi »

Hallo Jörg,

mein Fehler, das war jetzt leider doch nicht, was ich brauche :| (zu früh gefreut - und ich dachte langsam hab ich den Dreh beim R-Programmieren raus)

Deine code-zeile

Code: Alles auswählen

vO_12_25<- dbGetQuery(con, 'SELECT v FROM data WHERE "Ort" = :x AND "wind" =:y', params = list(x = seq(46,53), y = seq(10,18)))
funktioniert, wenn x und y gleich lang sind. Gibt es vielleicht eine Möglichkeit Vektoren unterschiedlicher Länge einzulesen?
ich kann die Funktion dbGetQuery() nicht finden. Zu welchem Paket gehört diese?
Ich habe ganz zu beginn das Paket library(RSQLite) geladen, ich vermute mal, dass es zu diesem Paket gehört.
Ist das richtig in Zusammenhang mit Deiner SQL-Abfrage?
Du hast natürlich recht. Es sollten eigentlich ganze Zahlen sein.

LG. Jess
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: getQuery mit zwei bedingungen

Beitrag von jessi »

Guten Morgen,

irgendwie komm ich nicht weiter. Wie schon beschrieben habe ich meine Daten aus eines sql-DB eingelesen. Jetzt möchte ich diese weiter selektieren. Mit einer Bedingung funktioniert das schon (glaube ich zumindest)

Code: Alles auswählen

#ich nehme Daten von jedem lO, aber nur welche die zwischen "Ort" (ist mein pO) = 46 und 53 liegen

vO <- dbGetQuery(con, 'SELECT v FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))
pO <- dbGetQuery(con, 'SELECT p FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))
lO <- dbGetQuery(con, 'SELECT l FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))

datenO <- data.frame(lO, pO, vO)
write.table(datenO, file = "C:\\...\\test_O.csv", sep = ";", dec = ",", col.names = TRUE, row.names = FALSE) 
wenn ich jetzt das File öffne und die Spalten filtere zB. nach lO = 10, dann habe ich zu diesem ausgewählten lO 8 verschiedene (durchlaufend von 46 bis 53) pO-Werte

Code: Alles auswählen

lO     pO	v
10	46	10
10	46	7
10	46	-99
...
10	47	10
10	47	8
10	47	1,8
...
10	48	10
10	48	8
10	48	1,8
...
Jetzt versuche ich die Daten weiter einzuschränken,

Code: Alles auswählen

vO_10_25<- dbGetQuery(con, 'SELECT v FROM data WHERE "Ort" = :x AND "KM" =:y', params = list(x = seq(46,53), y = seq(10,15)) 
pO_10_25<- dbGetQuery(con, 'SELECT p FROM data WHERE "Ort" = :x AND "KM" =:y', params = list(x = seq(46,53), y = seq(10,15)) 
lO_10_25<- dbGetQuery(con, 'SELECT l FROM data WHERE "Ort" = :x AND "KM" =:y', params = list(x = seq(46,53), y = seq(10,15)) 

datenO_10_25 <- data.frame(lO_10_25, pO_10_25, vO_10_25)
write.table(datenO_10_25, file = "C:\\...\\test_O.csv", sep = ";", dec = ",", col.names = TRUE, row.names = FALSE) 
wenn ich jetzt im File wieder die Filterfunktion verwende, z.B. für lO_10_25 = 10, dann habe ich nur zu einem pO (in diesem Fall 46) Werte

Code: Alles auswählen

lO     pO	v
10	46	10
10	46	7
10	46	-99
...
10	46	10
10	46	7
10	46	-99
...
Leider weiß ich nicht mehr weiter, eine google-Suche hat auch nichts ergeben. Gibt es vielleicht andere Auslese-Befehle im RSQL-Paket bei dem ich zwei oder mehr Bedingungen abfragen kann?

Vielen Dank für eure Hilfe.
Jessi
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: getQuery mit zwei bedingungen

Beitrag von jogo »

jessi hat geschrieben: Mi Jul 12, 2017 8:49 am Guten Morgen,

irgendwie komm ich nicht weiter. Wie schon beschrieben habe ich meine Daten aus eines sql-DB eingelesen. Jetzt möchte ich diese weiter selektieren. Mit einer Bedingung funktioniert das schon (glaube ich zumindest)

Code: Alles auswählen

#ich nehme Daten von jedem lO, aber nur welche die zwischen "Ort" (ist mein pO) = 46 und 53 liegen

vO <- dbGetQuery(con, 'SELECT v FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))
pO <- dbGetQuery(con, 'SELECT p FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))
lO <- dbGetQuery(con, 'SELECT l FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))

datenO <- data.frame(lO, pO, vO)
write.table(datenO, file = "C:\\...\\test_O.csv", sep = ";", dec = ",", col.names = TRUE, row.names = FALSE) 
Kannst Du eigentlich die Daten mit einer einzigen Abfrage aus der Datenbank holen? also:

Code: Alles auswählen

D <- dbGetQuery(con, 'SELECT l, p, v FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))
wenn ich jetzt das File öffne und die Spalten filtere zB. nach lO = 10, dann habe ich zu diesem ausgewählten lO 8 verschiedene (durchlaufend von 46 bis 53) pO-Werte

Code: Alles auswählen

lO     pO	v
10	46	10
10	46	7
10	46	-99
...
10	47	10
10	47	8
10	47	1,8
...
10	48	10
10	48	8
10	48	1,8
...
Das sieht doch gar nicht so schlecht aus. Aber mindesten die Spalte v ist nicht numerisch. Bitte zeig doch mal das Ergebnis von

Code: Alles auswählen

str(datenO)   # bzw. str(D)  falls Du die obige Abfrage verwendest
Jetzt versuche ich die Daten weiter einzuschränken,
was genau möchtest Du wie einschränken?
Es gibt jetzt verschiedene Möglichkeiten. Z.B. kannst Du jetzt auch die Funktionen von R einsetzen, um die Daten weiter einzuschränken.
z.B. split() oder subset() oder Auswahl über einen Index
Egal, was Du anstellen möchtest: als erstes gilt es das Einlesen der Daten zu kontrollieren und die Datenstruktur zu überprüfen (siehe oben mit str()).

Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: getQuery mit zwei bedingungen

Beitrag von jessi »

Hallo Jörg,
Kannst Du eigentlich die Daten mit einer einzigen Abfrage aus der Datenbank holen? also:

Code: Alles auswählen

D <- dbGetQuery(con, 'SELECT l, p, v FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))
Die Daten mit einer Abfrage aus der DB zu holen funktioniert.

Als Ausgabe bekomme ich:

Code: Alles auswählen

str(D)
'data.frame':   144984 obs. of  3 variables:
 $ l: chr  "7" "8" "9" "10" ...
 $ p   : chr  "46" "46" "46" "46" ...
 $ v : chr  "5" "-10" "3" "1" ...
Das Umwandeln von Chr in numerische Werte hätte ich so gemacht:

Code: Alles auswählen

my2num <- function(x) as.numeric(sub(",", ".", x)) #in Zahlen umwandeln 
D[] <- lapply(D, my2num)
was genau möchtest Du wie einschränken?
Ich habe Windmessdaten (Gitterpunkte) für ein ganzes Bundesland. Jetzt möchte ich aber nicht die kompletten Messdaten aus dem Bundesland auswerten, sondern nur jene, die sich in einem bestimmen Bereich (zB. im Bereich von p [48 bis 53] und l [10 bis 25]) befinden. Die Daten sind so aufgebaut, dass ich jeden p und l Wert einen Messwert zuordnen kann. Da ich zusätzlich auch noch die Zeit als Element habe, möchte ich die jeweiligen Daten mitteln. Beispielsweise lese ich die Daten von 01. bis 31. Jänner ein, jetzt bekomme ich 31 Windmessdaten für den Punkt p = 48 und l = 16, 31 Messdaten für p = 48, l = 17 usw. Über diese 31 Messwerte am Punkt p = 48 und l = 16 möchte ich dann Mitteln und dieses anschließend mit image.plot graphisch darstellen.

Dank schon mal für deine Antwort.
Jessi
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: getQuery mit zwei bedingungen

Beitrag von jogo »

Hallo Jessi,

wenn ich alles richtig verstanden habe, könnte es bisher so aussehen:

Code: Alles auswählen

my2num <- function(x) as.numeric(sub(",", ".", x)) #in Zahlen umwandeln 
D <- dbGetQuery(con, 'SELECT l, p, v FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))
D[] <- lapply(D, my2num)
aggregate(v ~ p + l, data=D, FUN=mean) # oder
aggregate(v ~ p + l, data=D, FUN=mean, subset= (l<16))
Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: getQuery mit zwei bedingungen

Beitrag von jessi »

Hallo Jörg,

genau so sieht es aus:

Code: Alles auswählen

library(RSQLite)
m <- dbDriver("SQLite")
con <- dbConnect(m, dbname = "data.sqlite")
alltables <- dbListTables(con)
alltables

D <- dbGetQuery(con, 'SELECT l, p, v FROM data WHERE "Ort" = :x', params = list(x = seq(46,53)))
my2num <- function(x) as.numeric(sub(",", ".", x)) #in Zahlen umwandeln 
D[] <- lapply(D, my2num)

mittelwert_v <- aggregate(D ~ p + l, data=D, FUN=mean) # Mittelwert berechnen 
#q95_v <- aggregate(D ~ p + l, data=D, FUN=quantile, probs = 0.95) # 95. Quantil berechnen
Mit diesem Code habe ich allerdings erst die Einschränkung über p, nun wäre es noch gut, wenn man auch den l-Bereich festlegen kann.

glg. J
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: getQuery mit zwei bedingungen

Beitrag von jogo »

Hatte ich in der vorherigen Nachricht schon geschrieben:

Code: Alles auswählen

aggregate(v ~ p + l, data=D, FUN=mean, subset= (l<16))
Du kannst das Ergebnis auch vergleichen mit

Code: Alles auswählen

aggregate(v ~ p + l, data=D[D$l<16,], FUN=mean)
Antworten