ich hab ein Problem bei dem bis jetzt leider keine loesung gefunden habe und einfach einen Tip in die richtig Richtung benoetige.
Eine Abfrage von mir liefert “viele” (tausende) Datenpunkte zurueck, diese Abfrage wird in eine andere Tabelle geschrieben, wobei ich aber nicht diese detaillierte Aufloesung benoetige.
Gibt eine eine Moeglichkeit mittels eines SQL statements zu sagen er soll es auf maximal 500 Datenpunkte beschraenken (und ich meine jetzt nicht die Top500, sondern ueber die Gesamtheit)
Ideen wie dies zu realsieren ist habe ich einige, leider konnte ich keine umsetzen
Count von Datapoint vor Query, dann pgSQL sagen nimm nur jeden x-ten datenpunkt
Average ueber x-datenpunkte (abhaenging von count again)
er extrahiert eine spalte, sortiert nach datum, for eine person.
SELECT hp.totalProfit FROM HandsPlayers hp
INNER JOIN Players pl ON (pl.id = hp.playerId)
INNER JOIN Hands h ON (h.id = hp.handId)
WHERE pl.id in (11)
GROUP BY h.startTime, hp.handId, hp.totalProfit
ORDER BY h.startTime
welche create table wollt ihr, alle involvierten?
die tabellen sind umfangreich (viele spalten), ist es ok wenn ich nur die verwendeten poste?
das endergebniss sollte eine liste mit 500 aufsummierten datenpunkten sein.
(keine gis anwendung, gewinn graph)
Und was genau ist “ein Datenpunk”? Ein Datensatz aus dem Beispiel-SQL?
Dann würde doch sowas gehen:
select totalProfit
from (
SELECT hp.totalProfit,
row_number() over () as rn
FROM HandsPlayers hp
INNER JOIN Players pl ON (pl.id = hp.playerId)
INNER JOIN Hands h ON (h.id = hp.handId)
WHERE pl.id in (11)
GROUP BY h.startTime, hp.handId, hp.totalProfit
ORDER BY h.startTime
) t
where rn <= 500;
Aber ohne mehr Details was genau Du als Ausgabe willst wird das ziemlich schwierig.
danke, die query was genau das was ich gesucht habe.
select totalProfit
from (
SELECT h.startTime,
sum(hp.totalProfit) over (order by h.startTime) as totalProfit,
row_number() over () as rn,
FROM HandsPlayers hp
INNER JOIN Players pl ON (pl.id = hp.playerId)
INNER JOIN Hands h ON (h.id = hp.handId)
WHERE pl.id in (11)
GROUP BY h.startTime, hp.handId, hp.totalProfit
ORDER BY h.startTime
) t
where (rn % 18.55)<=1;
da ich aber nicht die top500 zeilen benoetige, sondern einfach nur 500 “repraesentative zeilen” (muss nicht sehr genau sein, dh bildung von durchschnitt udgl ist nicht notwendig), nehme ich einfach jede zeile wo der rest der division kleiner eins ist. manchmal sind es 496 zeilen, aber das macht nichts.
ich war noch nicht erfolgreich einen “row count” der urspruenglichen query zu generieren, vielleicht hast du auch eine idee dafuer? unteres funktioniert (natuerlich nicht), soll mehr verdeutlichen was ich benoetige:
select totalProfitfrom (
SELECT h.startTime,
sum(hp.totalProfit) over (order by h.startTime) as totalProfit,
row_number() over () as rn
FROM HandsPlayers hp
INNER JOIN Players pl ON (pl.id = hp.playerId)
INNER JOIN Hands h ON (h.id = hp.handId)
WHERE pl.id in (5170)
GROUP BY h.startTime, hp.handId, hp.totalProfit
ORDER BY h.startTime
) t
where ( rn % (max(rn)/500) )<=1