按 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() 在内的几列分组以限制行但显示不在分组中的列
LinQ to Entities,Max Date字段,按什么分组