微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 按“另一列”选择“最大列值”行

这应该是一个简单的问题,但我不能让它工作:(

如何选择具有最大列值的行,作为另一列的组?

例如,

我有以下表定义:

ID
Del_Index
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 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,ROW_NUMBER() OVER
            (PARTITION BY DocgroupViewID ORDER BY Del_Index DESC)
        AS RowNumber
    FROM @t
)
SELECT *
FROM cteRowNumber
WHERE RowNumber = 1

如果您有办法解决关系,只需将其添加到ORDER BY.

原文地址:https://www.jb51.cc/mssql/78929.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐