Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để tôi có thể truy vấn xếp hạng cho những người dùng trong DB của mình, nhưng chỉ xem xét mục nhập mới nhất cho mỗi người dùng?

Đây là những gì tôi gọi là vấn đề "lớn nhất-n-mỗi-nhóm". Nó xuất hiện vài lần mỗi tuần trên StackOverflow.

Tôi giải quyết loại vấn đề này bằng cách sử dụng kỹ thuật nối ngoài:

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;

Điều này sẽ chỉ trả về một hàng cho mỗi tên người dùng - hàng có giá trị lớn nhất trong ScrapeDate cột. Đó là những gì tham gia bên ngoài là để thử để khớp với s1 với một số hàng khác s2 với cùng một tên người dùng và một ngày lớn hơn. Nếu không có hàng như vậy, phép nối ngoài trả về NULL cho tất cả các cột của s2 và sau đó chúng ta biết s1 tương ứng với hàng có ngày lớn nhất cho tên người dùng đã cho đó.

Điều này cũng sẽ hiệu quả khi bạn đang hoàn thành một phần công việc.

Kỹ thuật này không nhất thiết phải nhanh như các giải pháp CTE và RANKING mà các câu trả lời khác đã đưa ra. Bạn nên thử cả hai và xem điều gì phù hợp hơn với bạn. Lý do tôi thích giải pháp của mình hơn là nó hoạt động trong bất kỳ phiên bản nào của 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. SQL - Xoay nhiều cột mà không có Aggregrates

  2. Chúng tôi có thể khôi phục về trạng thái ban đầu sau khi chúng tôi đã sử dụng DBCC CHECKIDENT để khởi động lại số lượng cột Danh tính không?

  3. SQL Server tìm kiếm một cột theo tên

  4. Làm cách nào để liệt kê tất cả các khóa ngoại tham chiếu đến một bảng nhất định trong SQL Server?

  5. Làm cách nào để khôi phục truy vấn CẬP NHẬT trong SQL server 2005?