MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

5 cách để chọn hàng có giá trị tối đa cho nhóm của chúng trong SQL

Dưới đây là năm tùy chọn để sử dụng SQL để chỉ trả về những hàng có giá trị lớn nhất trong nhóm của chúng.

Những ví dụ này hoạt động trong hầu hết các RDBMS chính, bao gồm MySQL, MariaDB, Oracle, PostgreSQL, SQLite và SQL Server.

Dữ liệu Mẫu

Giả sử chúng ta có một bảng với dữ liệu sau:

SELECT * FROM Gameshow;

Kết quả:

+--------------+--------+---------+
| Contestant   | Game   | Score   |
|--------------+--------+---------|
| Faye         | 1      | 85      |
| Faye         | 2      | 50      |
| Faye         | 3      | 63      |
| Jet          | 1      | 31      |
| Jet          | 2      | 40      |
| Jet          | 3      | 51      |
| Spike        | 1      | 25      |
| Spike        | 2      | 27      |
| Spike        | 3      | 15      |
+--------------+--------+---------+

Và giả sử rằng chúng ta muốn mỗi thí sinh đạt điểm cao nhất.

Tùy chọn 1

Một tùy chọn nhanh chóng và dễ dàng là tạo truy vấn với SQL GROUP BY mệnh đề:

SELECT 
    Contestant,
    MAX( Score ) AS MaxScore
FROM Gameshow
GROUP BY Contestant
ORDER BY Contestant;

Kết quả:

+--------------+------------+
| Contestant   | MaxScore   |
|--------------+------------|
| Faye         | 85         |
| Jet          | 51         |
| Spike        | 27         |
+--------------+------------+

Tùy chọn 2

Nếu chúng ta muốn bao gồm trò chơi mà mỗi thí sinh đã chơi để đạt được điểm tối đa, thì một cách để làm điều đó là sử dụng một truy vấn con tương quan như sau:

SELECT 
    Contestant,
    Game,
    Score
FROM Gameshow g1
WHERE Score = ( SELECT MAX( g2.Score )
              FROM Gameshow g2
              WHERE g1.Contestant = g2.Contestant )
ORDER BY Contestant;

Kết quả:

+--------------+--------+---------+
| Contestant   | Game   | Score   |
|--------------+--------+---------|
| Faye         | 1      | 85      |
| Jet          | 3      | 51      |
| Spike        | 2      | 27      |
+--------------+--------+---------+

Truy vấn con có liên quan đề cập đến một hoặc nhiều cột từ bên ngoài truy vấn con. Các truy vấn con có liên quan có thể không hiệu quả, chủ yếu là do truy vấn con được thực thi nhiều lần, một lần cho mỗi hàng có thể được chọn bởi truy vấn bên ngoài. Truy vấn con tương quan còn được gọi là truy vấn con lặp lại.

Tùy chọn 3

Ngoài ra, chúng ta có thể sử dụng một truy vấn con không liên quan như sau:

SELECT 
    g1.Contestant, 
    g1.Game,
    g1.Score
FROM Gameshow g1
JOIN (
  SELECT Contestant, MAX( Score ) AS Score
  FROM Gameshow
  GROUP BY Contestant ) AS g2
  ON g1.Contestant = g2.Contestant AND g1.Score = g2.Score
ORDER BY Contestant ASC;

Kết quả:

+--------------+--------+---------+
| Contestant   | Game   | Score   |
|--------------+--------+---------|
| Faye         | 1      | 85      |
| Jet          | 3      | 51      |
| Spike        | 2      | 27      |
+--------------+--------+---------+

Các truy vấn con không liên quan không phụ thuộc vào truy vấn bên ngoài để thực thi chúng. Chúng có thể thực thi hoàn toàn độc lập với truy vấn bên ngoài.

Trong Oracle, chúng ta cần xóa AS khi khai báo bí danh cột:

SELECT 
    g1.Contestant, 
    g1.Game,
    g1.Score
FROM Gameshow g1
JOIN (
  SELECT Contestant, MAX( Score ) Score
  FROM Gameshow
  GROUP BY Contestant ) g2
  ON g1.Contestant = g2.Contestant AND g1.Score = g2.Score
ORDER BY Contestant ASC;

Tùy chọn 4

Một tùy chọn khác là sử dụng LEFT JOIN , như thế này:

SELECT 
    g1.Contestant, 
    g1.Game,
    g1.Score
FROM Gameshow g1
LEFT JOIN Gameshow g2 ON 
    g1.Contestant = g2.Contestant AND g1.Score < g2.Score
WHERE g2.Contestant IS NULL
ORDER BY g1.Contestant ASC;

Kết quả:

+--------------+--------+---------+
| Contestant   | Game   | Score   |
|--------------+--------+---------|
| Faye         | 1      | 85      |
| Jet          | 3      | 51      |
| Spike        | 2      | 27      |
+--------------+--------+---------+

Tùy chọn 5

Một cách khác để tìm nạp các hàng có giá trị lớn nhất trong một cột nhất định là sử dụng một biểu thức bảng chung với hàm window:

WITH cte AS (
   SELECT Contestant, Game, Score,
            RANK() OVER ( PARTITION BY Contestant
            ORDER BY Score DESC
            ) AS r
    FROM Gameshow
)
SELECT Contestant, Game, Score
FROM cte
WHERE r = 1
ORDER BY Contestant ASC;

Kết quả:

+--------------+--------+---------+
| Contestant   | Game   | Score   |
|--------------+--------+---------|
| Faye         | 1      | 85      |
| Jet          | 3      | 51      |
| Spike        | 2      | 27      |
+--------------+--------+---------+

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Id đối tượng Mongo DB deserializing sử dụng trình tuần tự JSON

  2. Tìm và Đếm các phần tử của bộ sưu tập với Mongoose

  3. Làm thế nào để thiết lập useMongoClient (Mongoose 4.11.0)?

  4. Nhiều dân cư - mongoosejs

  5. Sửa đổi thứ tự hiển thị các thuộc tính trong MongoDB