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
.