Paweł Koźbiał

Paweł Koźbiał Student,
Politechnika
Częstochowska

Temat: [PostgreSQL] zliczanie wystąpienia wartości dodatnich...

mam tabelę w której mam dane:

trader_id order_nbr symbol gross_pl net_pl event_date time
XXXXYYYY 1628975482 ZTR 0.0000 -0.0200 2010-06-01 15:06:24.199
XXXXYYYY 1628975482 ZTR 0.0000 -0.0100 2010-06-01 15:06:08.302
XXXXYYYY 1628975480 RAD 0.0000 0.0300 2010-06-01 15:05:41.44
XXXXYYYY 1628975479 DHF 0.0000 0.0400 2010-06-01 15:04:01.237
XXXXYYYY 1628975479 DHF 0.0000 0.0125 2010-06-01 15:02:42.613
XXXXYYYY 1628975479 DHF 0.0000 0.0125 2010-06-01 15:00:58.52

chcę uzyskać takie zapytanie, aby dla distinct(order_nbr) sprawdzało czy net_pl >= 0, oraz net_pl < 0, i sumowało wystąpienie tych wartości (nie sum(net_pl)), czyli uzyskać taki wynik:

trader_id net_pl_plus net_pl_minus
XXXXYYYY 2 1Paweł Koźbiał edytował(a) ten post dnia 01.08.11 o godzinie 16:49

konto usunięte

Temat: [PostgreSQL] zliczanie wystąpienia wartości dodatnich...

Coś takiego na początek:


select
trader_id,
case when net_pl > 0 then net_pl else 0 end net_pl_plus,
case when net_pl < 0 then net_pl else 0 end net_pl_minus
from t;


a sumowanie można zrobić np. tak:



select
trader_id,
sum(case when net_pl > 0 then net_pl else 0 end) net_pl_plus,
sum(case when net_pl < 0 then net_pl else 0 end) net_pl_minus
from t
group by trader_id;
Szymon G. edytował(a) ten post dnia 01.08.11 o godzinie 17:26
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: [PostgreSQL] zliczanie wystąpienia wartości dodatnich...

Szymon G.:

mała poprawka:


select
trader_id,
sum(case when net_pl > 0 then net_pl else 0 end) net_pl_plus,
-1 * sum(case when net_pl < 0 then net_pl else 0 end) net_pl_minus
from t
group by trader_id;
Paweł Koźbiał

Paweł Koźbiał Student,
Politechnika
Częstochowska

Temat: [PostgreSQL] zliczanie wystąpienia wartości dodatnich...

mnie chodzi o coś takiego:

SELECT SUM(CASE WHEN net_pl > 0 THEN 1.0 ELSE 0.0 END),
SUM(CASE WHEN net_pl < 0 THEN 1.0 ELSE 0.0 END) FROM t

tylko nie wiem jak to teraz połączyć z
DISTINCT (order_nbr)
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: [PostgreSQL] zliczanie wystąpienia wartości dodatnich...

Paweł Koźbiał:
mnie chodzi o coś takiego:

SELECT SUM(CASE WHEN net_pl > 0 THEN 1.0 ELSE 0.0 END),
SUM(CASE WHEN net_pl < 0 THEN 1.0 ELSE 0.0 END) FROM t
>
tylko nie wiem jak to teraz połączyć z
DISTINCT (order_nbr)

Jeśli dobrze zrozumiałem to chodzi o...


select trader_id, SUM(CASE WHEN net_pl >= 0 THEN 1.0 ELSE 0.0 END),
SUM(CASE WHEN net_pl < 0 THEN 1.0 ELSE 0.0 END)
from
(select
trader_id,
order_nbr,
sum(net_pl) net_pl
from t
group by trader_id, order_nbr
) t
group by trader_id;
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: [PostgreSQL] zliczanie wystąpienia wartości dodatnich...

Nie bardzo rozumiem jakie dane chcesz uzyskac. Zakladam ze najpierw sumujesz wartosci z kolumny net_pl a nastepnie patrzysz na wynik otrzymanej sumy (w obrebie danego order_id dla danego trader_id).

Dalej chcesz zliczyc wystapienia wszystkich order_id dla danego traider_id i jezeli wynik sumy dla danego order_id jest >= 0 to liczysz na plus a jezeli jest suma jest < 0 to liczysz na minus.

Oznacza to ze po sumowaniu zliczasz wystapienia wg warunku podanego warunku.

Zakladam ze order_id to id zamowienia a trader_id to numer klienta.

Stosowanie klauzuli distinct na kolumnie order_nbr jest bledne poniewaz distinct wezmie do podsumowania tylko jedna (dowolna) wartosc. Jezeli zdazy sie ze w jednym order_nbr raz wystapi net_pl < 0 i raz net_pl > 0 to w zaleznosci od planera raz dostaniesz policzenie na minus a raz na plus.

Rozwiazaniem jest suma po net_pl ze wzgledu na order_nbr a nastepnie wrzucenie do kolumny plus lub minus w zaleznosci od sumy a potem policzenie wystapien w kolumnach.

Dla przykladowej tabeli:
create table t (
trader_id text,
order_nbr int8,
symbol text,
gross_pl float,
net_pl float,
event_date date,
"time" time without time zone
);


Rozwiazanie:
select trader_id, count(net_pl_plus) as net_pl_plus, count(net_pl_minus) as net_pl_minus from
(
select
trader_id,
(case when sum(net_pl) >= 0 then sum(net_pl) else null end) as net_pl_plus,
(case when sum(net_pl) < 0 then sum(net_pl) else null end) as net_pl_minus
from t
group by trader_id, order_nbr
) as wynik
group by trader_id;


Proponuje zrobic z tego funkcje z paramerem gdzie bedzie podawany trader_id a zwracany record.Marcin Mackiewicz edytował(a) ten post dnia 01.08.11 o godzinie 19:15
Paweł Koźbiał

Paweł Koźbiał Student,
Politechnika
Częstochowska

Temat: [PostgreSQL] zliczanie wystąpienia wartości dodatnich...

Oba zapytania działają poprawnie, dzięki.
Dla jednego order_nbr występuje albo net_pl>0 albo net_pl<0, nie ma możliwości aby wystąpiły obie wartości dla jednego order_nbr.

A jak wrzucić to zapytanie Łukasza w moje, którego używam w funkcji:

for i in select distinct date_trunc('hour', time) from baza
LOOP
insert into wyniki_godzinne select trader_id , sum(net_pl), SUM(CASE WHEN net_pl >= 0 THEN 1.0 ELSE 0.0 END),
SUM(CASE WHEN net_pl < 0 THEN 1.0 ELSE 0.0 END), SUM(CASE WHEN gross_pl > 0 THEN gross_pl ELSE 0.0 END),
SUM(CASE WHEN gross_pl < 0 THEN gross_pl ELSE 0.0 END), event_date, i from baza b
where time between i and (i + interval '59 minutes 59 seconds 999 millisecond')
and not exists (select 1 from wyniki_dzienne w
where w.trader_id = b.trader_id
and w.event_date = b.event_date)
group by trader_id, event_date;
end LOOP;Paweł Koźbiał edytował(a) ten post dnia 02.08.11 o godzinie 15:23

konto usunięte

Temat: [PostgreSQL] zliczanie wystąpienia wartości dodatnich...

Lepiej jest zrobić insert z selecta, zamiast robić pętlę i wstawiać po jednym. Jak danych jest masakrycznie dużo warto wstawiać w paczkach, żeby transakcja nie wisiała zbyt długo...

Następna dyskusja:

zliczanie wartości z 3 kolumn




Wyślij zaproszenie do