sql >> Database teknologi >  >> RDS >> Mysql

DISTINCT ON forespørgsel m/ ORDER BY max værdi af en kolonne

Det ville være enkelt. Du behøver ikke max() heller ikke DISTINCT til dette:

SELECT *
FROM   profile_visits
WHERE  social_user_id = 21
AND    created_at > (now() - interval '2 months')
AND    visitor_id <> 21  -- ??
ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT  6;

Jeg formoder, at dit spørgsmål er ufuldstændigt. Hvis du vil:
de 6 seneste besøgende med deres seneste besøg på siden
så har du brug for en underforespørgsel. Du kan ikke få denne sorteringsrækkefølge på ét forespørgselsniveau, hverken med DISTINCT ON , og heller ikke med vinduesfunktioner:

SELECT *
FROM  (
   SELECT DISTINCT ON (visitor_id) *
   FROM   profile_visits
   WHERE  social_user_id = 21
   AND    created_at > (now() - interval '2 months')
   AND    visitor_id <> 21  -- ??
   ORDER  BY visitor_id, created_at DESC NULLS LAST, id DESC NULLS LAST
   ) sub
ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT  6;

Underforespørgslen sub får det seneste besøg pr. bruger (men ikke ældre end to måneder og ikke for en bestemt besøgende21 . ORDER BY skal have de samme indledende kolonner som DISTINCT ON .

Du skal bruge den ydre forespørgsel for at få de seneste 6 besøgende.
Tænk på rækkefølgen af ​​begivenheder:

Hvorfor NULLS LAST ? For at være sikker har du ikke angivet tabeldefinitionen.




  1. Hvordan forhindrer man oprettelse af poster, hvor værdien af ​​to felter er den samme?

  2. Hvordan tilføjes en ny kolonne til MYSQL-tabellen?

  3. Implementering af Django + Python 3 + PostgreSQL til AWS Elastic Beanstalk

  4. MySQL-opdatering øgede (ikke auto-forøgede) kolonneværdier