Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да направя заявка за класиране на потребителите в моята база данни, но да взема предвид само последния запис за всеки потребител?

Това е, което аз наричам проблем "най-голямото-n-на-група". Появява се няколко пъти седмично в StackOverflow.

Решавам този тип проблем с помощта на техника за външно свързване:

SELECT s1.*, s1.wins / s1.losses AS win_loss_ratio
FROM Scrape s1
LEFT OUTER JOIN Scrape s2
  ON (s1.username = s2.username AND s1.ScrapeDate < s2.ScrapeDate)
WHERE s2.username IS NULL
ORDER BY win_loss_ratio DESC;

Това ще върне само един ред за всяко потребителско име -- редът с най-голяма стойност в ScrapeDate колона. За това е външното съединение, за да опитате за съвпадение на s1 с някой друг ред s2 със същото потребителско име и по-голяма дата. Ако няма такъв ред, външното съединение връща NULL за всички колони на s2 и тогава знаем s1 съответства на реда с най-голямата дата за даденото потребителско име.

Това също трябва да работи, когато имате частично завършено остъргване в ход.

Тази техника не е непременно толкова бърза, колкото CTE и RANKING решенията, дадени от други отговори. Трябва да опитате и двете и да видите кое работи по-добре за вас. Причината, поради която предпочитам моето решение, е, че то работи във всеки вариант на SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво е datetime2?

  2. Как да използвате клаузата Where в Select Statement в SQL Server - SQL Server / TSQL Урок, част 109

  3. Копиране в модел на съседство

  4. SQL резервната версия е несъвместима с този сървър

  5. Осигурени данни в T-SQL