» »

postgresql - nasprotje od sum?

postgresql - nasprotje od sum?

boss-tech ::

Delam na tem primeru:

select l_id,sum(counter),state from data_retriever 
group by l_id, state
order by l_id

CREATE TABLE data_retriever
(
  id
  l_id character varying(50),
  state character varying,
  counter integer,
  c_date timestamp without time zone,
)


Se pravi da mi ta vrne seštevek(counter) zgrupiranih vrstic - grupira se po l_id ter stanju. Se pravi to mi dela ok. Kako pa
bi sedaj dobil razliko? Sem gledal, ampak nisem našel nasprotja od funkcije sum. Ima kdo kakšno idejo?

McAjvar ::

Funkcija sum() vrne vsoto vrednosti polj grupiranih zapisov. Torej, ce sesede 3 vrstice, bo sum() vrnil vrednost (zapis1 + zapis2 + zapis3). Kaksno razliko pa rabis? Ali je to (zapis1 - zapis2 - zapis3), (zapis2 - zapis1 - zapis3), (zapis3 - zapis1 - zapis2)? Ce je vrednost v polju zapis1 5, v zapis2 10 in v zapis3 15, bo sum() vrnil (5+10+15) = 30. Razlike pa bi bile za zgornje kombinacije: -20, -10 in 0, recimo.

Ce na tem seznamu ali drugje med dokumentacijo ne najdes funkcije, ki jo potrebujes, bos moral najbrz sam spisati funkcijo, ki bo pocela to, kar rabis.
"[...] the advance of civilization is nothing
but an exercise in the limiting of privacy."
- Isaac Asimov

boss-tech ::

V bistvu nastavljeno da bi delal samo razliko med 2 vrsticama. Counterji pa se večajo vsak dan.
Ampak funkcije pa ne najdem...

Zgodovina sprememb…

McAjvar ::

Verjetno funkcije ne bos nasel, ker vse agregatne funkcije delujejo nekako tako, da upostevajo _vse_ vrednosti, ki jih morajo obdelati. Nekako delajo na arrayu z vrednostmi, ki je velik od 0 do [stevila zapisov v result setu], niso omejene zgolj na 2 elementa.
"[...] the advance of civilization is nothing
but an exercise in the limiting of privacy."
- Isaac Asimov

boss-tech ::

Saj če delaš sum na grupi, potem ti pravilno izračuna. Vzame npr samo 2 vrstici in naredi sum.

Npr:

"1";"Rešen";9;"2011-06-10 00:00:00"
"1";"Rešen";7;"2011-06-09 00:00:00"
"1";"Nerešen";14;"2011-06-09 00:00:00"
"1";"Nerešen";12;"2011-06-10 00:00:00"

Rezultat sum: 

"1";16;"Rešena"
"1";26;"Nerešena"

Poldi112 ::

Namesto sum lahko daš max in min in ju odšteješ med seboj.
Where all think alike, no one thinks very much.
Walter Lippmann, leta 1922, o predpogoju za demokracijo.

McAjvar ::

Mhm, ampak zdaj pa dodaj se par zapisov. Recimo, ce imas naslednje zapise (ignoriram polje c_date):
l_id;state;counter
"1";"Rešen";9
"1";"Rešen";7
"1";"Nerešen";14
"1";"Nerešen";12
"1";"Rešen";16
"1";"Rešen";32

Potem ti tvoj zgornji query vrne:
l_id;sum;state
"1";26;"Nerešen"
"1";64;"Rešen"

Funkcija sum() mora znat obdelat tudi to, kaksno razliko pa bi v takem primeru pricakoval?

Mislim, da bos v vsakem primeru moral spisati svojo agregatno funkcijo, kjer bos definiral, kaj naj baza naredi z vrednostmi.
"[...] the advance of civilization is nothing
but an exercise in the limiting of privacy."
- Isaac Asimov


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

ASP.NET, C# spletna aplikacija in dodajanje kontrol v run time-u programa

Oddelek: Programiranje
71000 (732) kuall
»

SQL poizvedba

Oddelek: Programiranje
7619 (569) frudi
»

[Java]Branje podatkov iz datoteke

Oddelek: Programiranje
342645 (1951) jeryslo
»

programiranje C

Oddelek: Programiranje
62424 (2286) bozjak
»

Nahrbtnik za prenosnik

Oddelek: Kaj kupiti
121741 (1533) Gandalfar

Več podobnih tem