sql >> Database teknologi >  >> RDS >> PostgreSQL

Tæl kumulativ total i Postgresql

Med større datasæt, vinduefunktioner er den mest effektive måde at udføre denne slags forespørgsler på -- tabellen scannes kun én gang i stedet for én gang for hver dato, som en selvtilmelding ville gøre. Det ser også meget enklere ud. :) PostgreSQL 8.4 og nyere har understøttelse af vinduesfunktioner.

Sådan ser det ud:

SELECT created_at, sum(count(email)) OVER (ORDER BY created_at)
FROM subscriptions
GROUP BY created_at;

Her OVER skaber vinduet; ORDER BY created_at betyder, at den skal opsummere antallet i created_at bestille.

Rediger: Hvis du vil fjerne duplikerede e-mails inden for en enkelt dag, kan du bruge sum(count(distinct email)) . Desværre vil dette ikke fjerne dubletter, der krydser forskellige datoer.

Hvis du vil fjerne alle dubletter, tror jeg, det nemmeste er at bruge en underforespørgsel og DISTINCT ON . Dette vil tilskrive e-mails til deres tidligste dato (fordi jeg sorterer efter create_at i stigende rækkefølge, vil det vælge den tidligste):

SELECT created_at, sum(count(email)) OVER (ORDER BY created_at)
FROM (
    SELECT DISTINCT ON (email) created_at, email
    FROM subscriptions ORDER BY email, created_at
) AS subq
GROUP BY created_at;

Hvis du opretter et indeks på (email, created_at) , denne forespørgsel bør heller ikke være for langsom.

(Hvis du vil teste, er det sådan, jeg oprettede prøvedatasættet)

create table subscriptions as
   select date '2000-04-04' + (i/10000)::int as created_at,
          '[email protected]' || (i%700000)::text as email
   from generate_series(1,1000000) i;
create index on subscriptions (email, created_at);


  1. Hvordan viser man Oracle-skemastørrelse med SQL-forespørgsel?

  2. Hvordan pg_sleep_for() virker i PostgreSQL

  3. Hæver barren på MySQL, MariaDB, PostgreSQL og MongoDB Management

  4. ORACLE SQL:Udfyld manglende datoer