簡體   English   中英

選擇具有最大列值的行按另一列選擇

[英]Select Rows with Maximum Column Value group by Another Column

這應該是一個簡單的問題,但我不能讓它工作:(

如何選擇具有最大列值的行,作為另一列的組?

例如,

我有以下表定義:

ID
Del_Index
docgroupviewid

現在的問題是我想docgroupviewid按結果docgroupviewid ,然后從每個docgroupviewid組中選擇一行,具體取決於哪一行具有最高的del_index

我試過了

SELECT docgroupviewid, max(del_index),id FROM table
group by docgroupviewid

但是不是使用正確的id返回給我,而是返回具有相同docgroupviewid的組中最早的id

有任何想法嗎?

我自己多次努力,解決方案是以不同的方式思考你的查詢。

我想要每個DocGroupViewID行,其中Del_Index是具有該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 
)

當多個行可以具有相同的Del_Index ,它會變得更復雜,因為那時您需要某種方式來選擇要顯示的行。


編輯:想跟進另一個選項

您可以將RANK()ROW_NUMBER()函數與CTE一起使用,以獲得對結果的更多控制,如下所示:

-- 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

如果您有辦法解決關系,只需將其添加到ORDER BY

您將不得不稍微復雜一下您的查詢:

select a.docgroupviewid, a.del_index, a.id from table a
    where a.del_index = (select max(b.del_index) from table
        where b.docgroupviewid = a.docgroupviewid)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM