konsolidieren von Datenpunkten

Hi,

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

  1. Count von Datapoint vor Query, dann pgSQL sagen nimm nur jeden x-ten datenpunkt
  2. Average ueber x-datenpunkte (abhaenging von count again)

Danke fuer eure Hilfe,

Bitte poste die Tabellendefinitionen (idealerweise als CREATE TABLE) sowie Beispieldaten und das gewünschte Ergebnis.

  1. siehe castorp
  2. evtl. können Dir statistische Auswertungen weiterhelfen, ich denke da an Dinge wie PL/R. Handelt es sich um eine GIS-Anwendung?
  3. siehe 1.


    Andreas

dies ist der code von dem wir reden,

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)

Ja, also statistische Auswertung. Wie gesagt, schau Dir PL/R mal an, und R allgemein.


Andreas

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.

18.55 = (anzahl zeilen von urspruenglicher query) / 500 (=max anzahl zeilen)

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