sql >> Database >  >> RDS >> Sqlserver

SQL-query om slechts 1 record per groeps-ID te retourneren

SELECT  t.*
FROM    (
        SELECT  DISTINCT groupid
        FROM    mytable
        ) mo
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable mi
        WHERE   mi.groupid = mo.groupid
        ORDER BY
                age DESC
        ) t

of dit:

SELECT  *
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY age DESC) rn
        FROM    mytable
        ) x
WHERE   x.rn = 1

Dit levert maximaal één record per groep op, zelfs in het geval van gelijkspel.

Zie dit artikel in mijn blog voor prestatievergelijkingen van beide methoden:



  1. De werkelijke MySQL-querytijd meten

  2. PL/SQL-basisconversie zonder functies

  3. Waarom mislukt deze code in PostgreSQL en hoe kan dit worden opgelost (oplossing)? Is het een fout in de SQL-engine van Postgres?

  4. Hoe gebruik je een tekenreeks/kolomwaarde als mysql-datumintervalconstante (DAG, MAAND...)?