Suche Datenbank "Paten-Onkel"

Das ganze fängt langsam an und gefällt mir. Ganz speziell, weil
man nicht auf GUI FrontEnds angewiesen ist!

Würde gern zum testen Daten einspielen, die ich als CSV's habe
und die ich mittels AWK in die passende SQL Syntax verwandelt
habe. (je ein INSERT INTO.... pro Zeile).
Kann ich diese "testdatei.sql" aus meinem Script heraus einlesen?
Wär einfach für die Übersicht besser, wenn ich den ganzen Kram
nicht in mein Script kopiere.
 
Werbung:
Läuft dies quasi hinaus auf...

CREATE VIEW wth_rainsum AS
SELECT date, sum(rainfall) FROM wth_rain GROUP BY date;

...und wie frage ich dort Werte ab? Einfach als wärs ne Tabelle ?
Einfach als "SELECT * from wth_rainsum"
Hört sich ja fast so an, als wäre die Funktionalität "View" genau für sowas implementiert worden... Oder? :rolleyes:
 
Oh..... wieder was gelernt (glaube ich).
Kann ich in einem (postgre)SQL Script jederzeit auf alle
"Slash-Befehle" zurück greifen ?
 
COPY klingt sehr gut!
Dabei fiel mir gerade auf, dass in meinen Wetter CSV's die Datums-Syntax "dd.mm.yyyy"
verwendet wird, die psql so wohl nicht mag.
Gibt es da einen "vorgefertigten" Weg dies Problem zu lösen, also, dass man die Datums-
Formatierung als Option mit auf den Weg schickt ?
 
works for me:

Code:
test=# create table wetter(d date);
CREATE TABLE
Time: 0,716 ms
test=*# copy wetter from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 22.10.2015
>> \.
COPY 1
Time: 5846,370 ms
test=*# select * from wetter ;
  d
------------
2015-10-22
(1 row)

Du kannst solch Probleme generell lösen, indem Du die Daten erst einmal in eine Import-Tabelle holst und dann mit z.B. to_date() und ähnlichen Funktionen hantierst.
 
Nach viel Lesen dank der hilfreichen Tips grübel ich gerade über folgendem:

Tabelle "p_stay" enthält (name/text, von/date, bis/date), wobei je name durchaus mehrere Einträge (Intervalle) vorkommen können.
Als Datums-Grenzen ergeben sich min(von) und max(bis).
Als Hilfestellung für mich hätte ich hier noch die Personen-Datenbank p_base, in welcher jeder Teilnehmer eine id hat.

Nun möchte ich abfragen, wie viele Personen sich an welchem Tag (datum) der Zeitraums dort aufgehalten haben, was also eine schlichte Datumsliste mit der Anzahl der Personen wird.
 
Vermutlich käme ich schon weiter, wenn ich aus einem von-bis oder einer daterange eine Liste/Ausgabe der enthaltenen Tage erzeugen könnte. Hat da einer mal bitte einen Tip für mich?
 
Da würde in in PG gleich zu DATERANGE greifen und es so machen:

Code:
test=*# select * from raeven ;
 name |  anwesend
------+-------------------------
 max  | [2015-10-01,2015-10-05)
 max  | [2015-10-10,2015-10-15)
 max  | [2015-10-20,2015-10-25)
 udo  | [2015-10-01,2015-10-15)
 egon | [2015-10-15,2015-10-25)
 lisa | [2015-10-05,2015-10-15)
 lisa | [2015-10-17,2015-10-25)
(7 rows)

Time: 0,267 ms
test=*# select * from raeven where anwesend @> '2015-10-03'::date;
 name |  anwesend
------+-------------------------
 max  | [2015-10-01,2015-10-05)
 udo  | [2015-10-01,2015-10-15)
(2 rows)

Time: 0,736 ms
test=*# select * from raeven where anwesend @> '2015-10-13'::date;
 name |  anwesend
------+-------------------------
 max  | [2015-10-10,2015-10-15)
 udo  | [2015-10-01,2015-10-15)
 lisa | [2015-10-05,2015-10-15)
(3 rows)

Time: 0,245 ms
test=*# select * from raeven where anwesend @> '2015-10-23'::date;
 name |  anwesend
------+-------------------------
 max  | [2015-10-20,2015-10-25)
 egon | [2015-10-15,2015-10-25)
 lisa | [2015-10-17,2015-10-25)
(3 rows)
 
Ah, okay. Anwesenheitsliste Oktober:

Code:
test=*# with tag as (select ('2015-10-01'::date + s * '1day'::interval)::date as datum from generate_Series(0,30) s) select tag.datum, array_to_string(array_agg(raeven.name),', ') from tag left join raeven on raeven.anwesend @> tag.datum group by tag.datum;
  datum  | array_to_string
------------+-----------------
 2015-10-30 |
 2015-10-31 |
 2015-10-16 | egon
 2015-10-13 | max, udo, lisa
 2015-10-28 |
 2015-10-11 | max, udo, lisa
 2015-10-03 | max, udo
 2015-10-04 | max, udo
 2015-10-21 | max, egon, lisa
 2015-10-18 | egon, lisa
 2015-10-02 | max, udo
 2015-10-22 | max, egon, lisa
 2015-10-15 | egon
 2015-10-29 |
 2015-10-19 | egon, lisa
 2015-10-08 | udo, lisa
 2015-10-09 | udo, lisa
 2015-10-14 | max, udo, lisa
 2015-10-17 | egon, lisa
 2015-10-23 | max, egon, lisa
 2015-10-25 |
 2015-10-20 | max, egon, lisa
 2015-10-06 | udo, lisa
 2015-10-12 | max, udo, lisa
 2015-10-07 | udo, lisa
 2015-10-05 | udo, lisa
 2015-10-26 |
 2015-10-24 | max, egon, lisa
 2015-10-27 |
 2015-10-10 | max, udo, lisa
 2015-10-01 | max, udo
(31 rows)
 
Gleich nochwas hinterher....
Da ich ja meine Basis-Daten aus CSV's einlese... wie verwandel ich meine beiden Spalten VON und BIS in ein daterange? Ich experimentier gerade ergebnislos und finde in den Manuals bisher nix passendes :-/
 
Code:
test=*# select '2015-10-01'::date, '2015-10-20'::date;
  date  |  date
------------+------------
 2015-10-01 | 2015-10-20
(1 row)

Time: 0,149 ms
test=*# select daterange('2015-10-01'::date, '2015-10-20'::date,'[)');
  daterange
-------------------------
 [2015-10-01,2015-10-20)
(1 row)
 
Werbung:
Ich möchte mich übrigens mal ganz herzlich bedanken!

Die Hilfestellung hier hat mir wohl dutzende Tage plan-/hilfloses Herumsuchen auf postgesql.org/docs/ erspart!

So manch geantwortete Syntax hat mir erstmal Kringel in den Augen beschert, aber das ließ sich dann dank der Manuals (zumindest teilweise) aufdröseln und hat sehr weiter geholfen, auch wenn meine Versuche der Umsetzung deutlichst primitiver und vermutlich recht redundanter strukturiert sind.

Chris
 
Zurück
Oben