sql >> Databasteknik >  >> RDS >> Mysql

DISTINCT ON query with ORDER BY max värde för en kolumn

Det skulle vara enkelt. Du behöver inte max() inte heller DISTINCT för detta:

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;

Jag misstänker att din fråga är ofullständig. Om du vill:
de 6 senaste besökarna med sitt senaste besök på sidan
då behöver du en underfråga. Du kan inte få den här sorteringsordningen på en frågenivå, inte heller med DISTINCT ON , inte heller med fönsterfunktioner:

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;

Underfrågan sub får det senaste besöket per användare (men inte äldre än två månader och inte för en viss besökare21 . ORDER BY måste ha samma inledande kolumner som DISTINCT ON .

Du behöver den yttre frågan för att få de 6 senaste besökarna då.
Tänk på händelseförloppet:

Varför NULLS LAST ? För att vara säker, angav du inte tabelldefinitionen.




  1. hur man ställer in standardvärde för texttyp i mysql

  2. Kontrollera att tabellen finns eller inte innan du skapar den i Oracle

  3. Är merge-satsen tillgänglig i MySQL

  4. Unik begränsning, hur man undviker dubbletter