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

5 cách để chọn hàng với giá trị tối thiểu 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ị nhỏ 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 tôi muốn nhận được điểm thấp nhất cho mỗi thí sinh.

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,
    MIN( Score ) AS MinScore
FROM Gameshow
GROUP BY Contestant
ORDER BY Contestant;

Kết quả:

+--------------+------------+
| Contestant   | MinScore   |
|--------------+------------|
| Faye         | 50         |
| Jet          | 31         |
| Spike        | 15         |
+--------------+------------+

Tùy chọn 2

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

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

Kết quả:

+--------------+--------+---------+
| Contestant   | Game   | Score   |
|--------------+--------+---------|
| Faye         | 2      | 50      |
| Jet          | 1      | 31      |
| Spike        | 3      | 15      |
+--------------+--------+---------+

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, MIN( 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         | 2      | 50      |
| Jet          | 1      | 31      |
| Spike        | 3      | 15      |
+--------------+--------+---------+

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, MIN( 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 cách khác để tìm nạp các hàng có giá trị nhỏ nhất trong một cột nhất định 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         | 2      | 50      |
| Jet          | 1      | 31      |
| Spike        | 3      | 15      |
+--------------+--------+---------+

Tùy chọn 5

Một cách khác để làm điều đó là sử dụng một biểu thức bảng chung với hàm cửa sổ:

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

Kết quả:

+--------------+--------+---------+
| Contestant   | Game   | Score   |
|--------------+--------+---------|
| Faye         | 2      | 50      |
| Jet          | 1      | 31      |
| Spike        | 3      | 15      |
+--------------+--------+---------+

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để chèn HTML vào Mongodb?

  2. Cách lấy Ngày, Tháng và Năm từ một Ngày trong SQL

  3. Cách chuyển đổi chuỗi thành objectId trong LocalField cho $ lookup Mongodb

  4. Trò chuyện thời gian thực với Modulus và Node.js

  5. Mẹo quản lý MongoDB từ xa