当前位置: 首页 > 面试题库 >

按另一列选择具有最大列值的行组

白阳煦
2023-03-14
问题内容

这应该是一个简单的问题,但我无法使其起作用:(

如何按另一列分组选择具有最大列值的行?

例如,

我有以下表格定义:

ID
Del_Index
docgroupviewid

现在的问题是,我想先按结果分组docgroupviewid,然后再从每组中选择一行docgroupviewid,具体取决于哪一组具有最高的del_index

我试过了

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

但是,与其以正确的方式id回报我,不如id以同一个小组中最早的回报我docgroupviewid

有任何想法吗?


问题答案:

我本人为此进行了很多次努力,解决方案是以不同的方式考虑您的查询。

我希望其中具有该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



 类似资料:
  • 问题内容: 我已经看到了很多解决此类问题的解决方案尤其是此SQL仅选择在Column上具有Max Value的行,但是似乎没有一个合适的解决方案: 我有以下表格布局,即附件的版本控制,这些附件绑定到实体: 输出应该是最大版本号,按group_id和Entity_id分组,如果有帮助,我只需要一个单个entity_id的列表即可: 我想出的是这种自我加入: 但是,只有在不同的实体不共享相同的组号的情

  • 问题内容: 我有一张交易数据表,这些数据是对未来的预测。因此,随着时间的流逝和重新发送的预测变得更加准确,可以多次读取由相同日期,类型,位置和产品标识的相同预测。 我想创建一个查询,将相同类型,相同位置,产品和日期的交易分组,然后从这些分组中仅选择具有最新时间戳的交易。 该表现在有成千上万的行,随着时间的流逝,数百万行,因此,一个合理有效的解决方案将不胜感激:) 表格示例: 理想的结果: 我尝试例

  • 问题内容: 我有下表。 我想选择的每一个具有最低。 当我得到所需的内容后,一旦添加了列,就需要将其也添加到GROUP BY子句,当我需要的只是每种类型的最低要求时,它返回所有行。 问题答案: 在标准SQL中,这可以使用窗口函数来完成 但是,Postgres具有运算符,该运算符通常比带有窗口函数的相应解决方案要快:

  • 问题内容: 想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么答案正确的解释。答案不够详细的答案可能会被编辑或删除。 这个问题已经在这里有了答案 : 检索每个组中的最后一个记录-MySQL (27个答案) 去年关闭。 我有此表用于文档(此处为简化版): 如何为每个ID选择一行,而仅选择最大转速? 根据上述数据,结果应包含两行:和。我正在使用 MySQL 。 目前,我在循环中使用检查来检测

  • 在oracle DB中检索具有大组最大值的行时遇到问题。 我的桌子看起来是这样的: id,col1,col2,col3,col4,col5,date_col 谢谢你的提示! 干杯

  • 问题内容: 我的表是: 我需要选择每个包含的最大值。 结果将是: 我试过了: 不起作用 尽管数据库保留187个,但结果集有130行。结果包括的一些重复项。 没有。提供所有记录。 具有各种结果。 问题答案: 你好亲密!您需要做的就是选择住所及其最大日期时间,然后再加入到两个字段的表中: