Sql 按最大值分组
我正试图拉符号和价格的最大数量的股东每符号。例如,对于ASN,我只有一行,价格为60.62美元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
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;