sql >> Database >  >> RDS >> Mysql

DISTINCT ON query w/ ORDER BY max waarde van een kolom

Dat zou eenvoudig zijn. Je hebt max() . niet nodig noch DISTINCT hiervoor:

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;

Ik vermoed dat je vraag onvolledig is. Als je wilt:
de 6 laatste bezoekers met hun laatste bezoek aan de pagina
dan heb je een subquery nodig. U kunt deze sorteervolgorde niet op één zoekniveau krijgen, ook niet met DISTINCT ON , noch met vensterfuncties:

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;

De subquery sub krijgt het laatste bezoek per gebruiker (maar niet ouder dan twee maanden en niet voor een bepaalde bezoeker21 . ORDER BY moet dezelfde voorloopkolommen hebben als DISTINCT ON .

Je hebt dan de buitenste zoekopdracht nodig om de 6 laatste bezoekers te krijgen.
Houd rekening met de volgorde van gebeurtenissen:

Waarom NULLS LAST ? Voor de zekerheid heb je de tabeldefinitie niet opgegeven.




  1. Spring Data met Mysql JSON-type

  2. Video:Oracle 12c IDENTITY Column Performance op RAC

  3. Hoe de naam van een beperking in Oracle te vinden

  4. java.lang.OutofMemorySpace:Java heap-ruimte tijdens het ophalen van 120 miljoen rijen uit de database in pyspark