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

Chọn nhóm có giá trị cột tối đa theo một cột khác

Bản thân tôi đã phải vật lộn với điều này nhiều lần và giải pháp là hãy suy nghĩ về truy vấn của bạn theo cách khác.

Tôi muốn mỗi hàng DocGroupViewID trong đó Del_Index là cao nhất (tối đa) cho tất cả các hàng có DocGroupViewID đó:

SELECT
    T.DocGroupViewID,
    T.Del_Index,
    T.ID
FROM MyTable T
WHERE T.Del_Index = (
    SELECT MAX( T1.Del_Index ) FROM MyTable T1
    WHERE T1.DocGroupViewID = T.DocGroupViewID 
)

Nó trở nên phức tạp hơn khi nhiều hàng có thể có cùng một Del_Index , vì vậy bạn cần một số cách để chọn cái nào sẽ hiển thị.

EDIT:muốn theo dõi với một tùy chọn khác

Bạn có thể sử dụng RANK() hoặc ROW_NUMBER() chức năng với CTE để kiểm soát nhiều hơn các kết quả, như sau:

-- fake a source table
DECLARE @t TABLE (
    ID int IDENTITY(1,1) PRIMARY KEY,
    Del_Index int,
    DocGroupViewID int
)

INSERT INTO @t
SELECT 1, 1 UNION ALL
SELECT 2, 1 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 1, 2 UNION ALL
SELECT 2, 2 UNION ALL
SELECT 2, 2 UNION ALL
SELECT 1, 3 UNION ALL
SELECT 2, 3 UNION ALL
SELECT 3, 3 UNION ALL
SELECT 4, 3

-- show our source
SELECT * FROM @t

-- select using RANK (can have duplicates)
;WITH cteRank AS
(
    SELECT
        DocGroupViewID,
        Del_Index,
        ID,
        RANK() OVER
            (PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
        AS RowRank,
        ROW_NUMBER() OVER
            (PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
        AS RowNumber
    FROM @t
)
SELECT *
FROM cteRank
WHERE RowRank = 1

-- select using ROW_NUMBER
;WITH cteRowNumber AS
(
    SELECT
        DocGroupViewID,
        Del_Index,
        ID,
        RANK() OVER
            (PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
        AS RowRank,
        ROW_NUMBER() OVER
            (PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
        AS RowNumber
    FROM @t
)
SELECT *
FROM cteRowNumber
WHERE RowNumber = 1

Nếu bạn có cách sắp xếp các mối quan hệ, chỉ cần thêm nó vào ORDER BY .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có thể đếm số phiên để xác định số người trực tuyến không?

  2. MySQL chọn bản ghi 1 giờ trước hoặc mới hơn trên cột ngày giờ

  3. Lợi ích của việc tạo Thủ tục lưu trữ trong SQL và MySQL là gì?

  4. Sự cố khi sử dụng MySQL với AWS Lambda bằng Python

  5. MySQL có kèm theo MAMP không bao gồm tệp cấu hình không?