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

Pobieranie najnowszych rekordów w zapytaniu

MySQL nie posiada funkcji rankingowej/analitycznej/okienkowej.

SELECT tl.locationid, tl.timestamp, tp.name, X, Y, Z
  FROM tblPerson tp
  JOIN tblLocation tl ON tl.personid = tp.personid
  JOIN (SELECT t.personid,
               MAX(t.timestamp) AS max_date
          FROM tblLocation t
      GROUP BY t.personid) x ON x.personid = tl.personid
                            AND x.max_date = tl.timestamp

SQL Server 2005+ i Oracle 9i+ obsługują analitykę, więc możesz użyć:

SELECT x.locationid, x.timestamp, x.name, x.X, x.Y, x.Z
  FROM (SELECT tl.locationid, tl.timestamp, tp.name, X, Y, Z,
               ROW_NUMBER() OVER (PARTITION BY tp.name ORDER BY tl.timestamp DESC) AS rank
          FROM tblPerson tp
          JOIN tblLocation tl ON tl.personid = tp.personid) x
WHERE x.rank = 1

Używanie zmiennej, aby uzyskać to samo, co funkcja ROW_NUMBER w MySQL:

SELECT x.locationid, x.timestamp, x.name, x.X, x.Y, x.Z
  FROM (SELECT tl.locationid, tl.timestamp, tp.name, X, Y, Z,
               CASE
                 WHEN @name != t.name THEN
                   @rownum := 1
                 ELSE @rownum := @rownum + 1
               END AS rank,
               @name := tp.name
          FROM tblLocation tl
          JOIN tblPerson tp ON tp.personid = tl.personid
          JOIN (SELECT @rownum := NULL, @name := '') r
      ORDER BY tp.name, tl.timestamp DESC) x
WHERE x.rank = 1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 do SQL Server Compact Edition?

  2. Dla Nvarchar(Max) otrzymuję tylko 4000 znaków w TSQL?

  3. Dwa radykalnie różne zapytania dotyczące rekordów 4 mln są wykonywane w tym samym czasie - jedno wykorzystuje brute force

  4. SQL:Audyt zwrotów dla rekordów dla każdej kolumny

  5. UNION wyniki wielu procedur składowanych