Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie SQL zwracające tylko 1 rekord na identyfikator grupy

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

lub to:

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

To zwróci co najwyżej jeden rekord na grupę, nawet w przypadku remisów.

Zobacz ten artykuł na moim blogu, aby porównać wydajność obu metod:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak możemy użyć ISNULL do wszystkich nazw kolumn w SQL Server 2008?

  2. Wymień, które kolumny mają indeks pełnotekstowy w SQL Server 2005

  3. Użyj set w instrukcji case w SQL Server

  4. SQL Server 2008 — łączenie ciągów

  5. Błąd:nie można pobrać wiersza od ADsDSOObject dostawcy OLE DB dla serwera połączonego ADSI