按 Max 分组

Posted

技术标签:

【中文标题】按 Max 分组【英文标题】:Group by Max 【发布时间】:2010-10-06 06:48:57 【问题描述】:
SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder]
FROM tblIssue

我正在尝试为每个 symb 的最大股东数量提取 symb 和价格。例如,我只有 1 行 ASN,价格为 60.62 美元。

SYMB价格股东 ASN $0.00 0 ASN 0.00 美元 51 ASN $25.18 0 ASN $25.26 0 ASN $36.00 0 ASN 60.62 231 美元 ASNL $0.00 101 ASR $0.00 4 ASR $0.00 24 ASR 37.17 美元 13

【问题讨论】:

@Quassnoi:我推断 Steve 使用的是 Microsoft SQL Server,因为方括号作为标识符分隔符。 【参考方案1】:

在甲骨文中:

SELECT symb, price
FROM (
  SELECT symb, price, ROW_NUMBER() OVER (PARTITION BY symb ORDER BY price DESC) AS rn
  FROM   tblIssue
)
WHERE rn = 1

【讨论】:

【参考方案2】:
WITH mx AS (
    SELECT tblIssue.SYMB, MAX(tblIssue.[Shareholder])
    FROM tblIssue
)
SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder]
FROM tblIssue
INNER JOIN mx
    ON mx.SYMB = tblIssue.SYMB
    AND mx.[Shareholder] = tblIssue.[Shareholder]

这应该产生:

SYMB    Price   Shareholder
ASN $60.62  231
ASNL    $0.00   101
ASR $0.00   24

如果这就是你要找的。​​p>

【讨论】:

【参考方案3】:

这会有所帮助;

Select * From tblIssue t2
Join 
(
Select MAX(t1.Shareholder) shrhldr, t1.symb symb
From tblIssue t1
Group by t1.symb
) tt On tt.shrhldr = t2.Shareholder and tt.symb = t2.symb

【讨论】:

【参考方案4】:

相关子查询似乎是最简单的(如果我理解您的问题):

select symb, price, shareholder
from issue i
where price = ( select max(price) from issue where symb = i.symb)

产生:

ASN 61 231
ASNL 0 101
ASR 37 13

【讨论】:

【参考方案5】:

这类似于 Quassnoi 的回答,但更正以获取最大股东的行,这是 OP 所要求的。如果您有多行具有相同数量的最大股东的相同符号,它将随机给您其中之一。如果您想要所有这些,请将 ROW_NUMBER 更改为 RANK。

SELECT symb, price, shareholder
FROM (
  SELECT symb, price, shareholder, ROW_NUMBER() OVER (PARTITION BY symb ORDER BY shareholder DESC) AS rn
  FROM   tblIssue
)
WHERE rn = 1

【讨论】:

【参考方案6】:
SELECT i1.*
FROM tblIssue i1
  LEFT OUTER JOIN tblIssue i2
  ON (i1.[SYMB] = i2.[SYMB] AND i1.[Shareholder] < i2.[Shareholder])
WHERE i2.[SYMB] IS NULL;

这是我在处理这类问题时使用的技巧:当没有其他行 i2 具有相同的 [SYMB] 和更大的 [Shareholder] 时,显示对应于 i1 的行。 IE。如果不存在具有更大[Shareholder] 的行,则i1 必须具有最大值。

当每个 [SYMB] 的不同值的最高 [Shareholder] 值相同时,此查询将返回多行,但对于此线程上其他人给出的大多数其他答案也是如此。要解决这个问题,您必须使用表的唯一列向联接添加另一个条件。

【讨论】:

以上是关于按 Max 分组的主要内容,如果未能解决你的问题,请参考以下文章

按包括 MAX() 在内的几列分组以限制行但显示不在分组中的列

SQL - 使用 MAX 函数按问题分组两列

LinQ to Entities,Max Date字段,按什么分组

在 Pandas Dataframe 上按分组并使用 APPLY 和 MAX 操作 [重复]

Python Pandas 按功能分组

r - 按日期过滤,按条件分组