Sql 按最大值分组

Sql 按最大值分组,sql,sql-server,aggregate-functions,greatest-n-per-group,Sql,Sql Server,Aggregate Functions,Greatest N Per Group,我正试图拉符号和价格的最大数量的股东每符号。例如,对于ASN,我只有一行,价格为60.62美元 SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder] FROM tblIssue SYMB Price股东 ASN$0.00 ASN$0.00 51 ASN$25.18 0 新加坡元25.26元 ASN$36.00 0 ASN$60.62 231 ASNL$0.00 101 ASR$0.00 4 ASR$0.00 24 ASR$3

我正试图拉符号和价格的最大数量的股东每符号。例如,对于ASN,我只有一行,价格为60.62美元

SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder]
FROM tblIssue
SYMB Price股东 ASN$0.00 ASN$0.00 51 ASN$25.18 0 新加坡元25.26元 ASN$36.00 0 ASN$60.62 231 ASNL$0.00 101 ASR$0.00 4 ASR$0.00 24 ASR$37.17 13 在Oracle中:

SYMB Price Shareholder 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 这应产生:

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

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

产生:

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

这与Quassnoi的回答类似,但经过修正后得到了与max股东的争吵,这是OP所问的问题。如果同一符号有多行,且最大股东数相同,则会随机给出其中一行。如果您想要全部,请将“行数”更改为“排名”

ASN 61 231
ASNL 0 101
ASR 37 13
选择i1*
来自tblIssue i1
左外连接tblIssue i2
ON(i1.[SYMB]=i2.[SYMB]和i1.[Holder]
这是我处理这类问题时使用的技巧:当没有其他行
i2
具有相同的
[SYMB]
和更大的
[holder]
时,显示与
i1
对应的行。也就是说,如果不存在大于
[股东]
的行,则
i1
必须具有最大值


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

@Quassnoi:我推断Steve正在使用Microsoft SQL Server,因为方括号用作标识符分隔符。
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
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
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;