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

Hvordan får man id for rækken, der blev valgt af aggregatfunktion?

Der er mindst 3 måder, se nedenfor:

CREATE TEMP TABLE test (
    id integer, name text, amount numeric, datefrom timestamptz
);

COPY test FROM STDIN (FORMAT csv);
3,a,8,2018-01-01
4,a,3,2018-01-15 10:00
5,b,1,2018-02-20
6,b,1,2019-01-01
\.

Metode 1. ved hjælp af DISTINCT ON (PostgreSQL-specifik)

SELECT DISTINCT ON (name)
  id, name, amount
FROM test
ORDER BY name, amount DESC, datefrom ASC;

Metode 2. ved hjælp af vinduesfunktioner

SELECT id, name, amount FROM (
  SELECT *, row_number() OVER (
    PARTITION BY name
    ORDER BY amount DESC, datefrom ASC) AS __rn
  FROM test) AS x
WHERE x.__rn = 1;

Metode 3. ved hjælp af korreleret underforespørgsel

SELECT id, name, amount FROM test
WHERE id = (
  SELECT id FROM test AS t2
  WHERE t2.name = test.name
  ORDER BY amount DESC, datefrom ASC
  LIMIT 1
); 


  1. Application Code Redesign for at reducere antal. af databasehits fra præstationsperspektiv

  2. Hvordan får jeg MySQL-tabelstrukturen i PHP? Plus en liste over alle borde?

  3. Optimal forespørgsel til at hente en kumulativ sum i MySQL

  4. ORA-12638:Hentning af legitimationsoplysninger mislykkedes