如何为最小的列数显示一行?
Posted
技术标签:
【中文标题】如何为最小的列数显示一行?【英文标题】:How do I Display one Row for the lowest number of a column? 【发布时间】:2009-01-29 16:05:00 【问题描述】:这个问题很复杂,所以示例效果最好...我有下表关于 ODBC,而不是 SQL 服务器管理
NAME SEQNUM
JOHN 2
JOHN 4
JOHN 7
MARY 12
MIKE 4
MIKE 9
PETER 7
PETER 12
所以,我想撤回一个 seqNum 最低的名字...
NAME SEQNUM
JOHN 2
MARY 12
MIKE 4
PETER 7
此数据不适用于SELECT (MIN(SEQNUM))
。这会返回一个数字。我希望将实际数据放入我的数据集中。
有谁知道这是怎么做到的吗?
【问题讨论】:
您是只对一行感兴趣,还是对一行/名称感兴趣? 您希望结果显示什么?我仍然对您要完成的工作感到困惑。 【参考方案1】:select Name, MIN(SEQNUM)
from TABLE
Group By Name
【讨论】:
min(seqnum) 重新计算一个数字...还有其他你知道的方法吗? 但是他的选择也使用了选择名称,所以你也得到了你正在寻找的文本字段 另一种获得最小值的方法?我不确定你的意思。 MIN(SEQNUM) as SeqNum 会给你一个列名。然后您可以在数据集或模拟中按名称访问它..【参考方案2】:我相信这就是你想要的:
select NAME, min(SEQNUM) as SEQNUM
from TABLE
group by NAME
【讨论】:
糟糕,第一个答案太复杂了。这个简单的分组应该足以满足您的需求。【参考方案3】:SELECT TOP 1 Name, SeqNum FROM yourtable ORDER BY SeqNum DESC
将显示具有最高 SeqNum 的那个
【讨论】:
切换排序顺序可以得到最低 您只会得到 1 行有 1 个名称,而不是所有需要的名称【参考方案4】:将 Ian 和 Bill 的答案结合在一起可以让您两全其美 - 访问完整的记录,而不必进行可能非常昂贵的联接(任何不是等值联接的联接都可能会像您不会那样搞砸相信)。
SELECT t1.*
FROM yourtable t1,
(SELECT name, MIN(seqnum) as seqnum
FROM yourtable
GROUP BY name) t2
WHERE t1.name=t2.name
AND t1.seqnum=t2.seqnum
您也可以使用连接语法来实现相同的结果(而不是 WHERE),但在这种情况下,我认为如果使用 where 会更清楚发生了什么。
【讨论】:
好吧,我不是 MS SQL Server 优化器方面的专家,但在我看来,派生表上的连接不太可能利用 seqnum 上的索引。计算 MIN() 可能是的,但是我没想到会这样。 也就是说,我希望索引查找比非等值连接更能提高性能。【参考方案5】:SELECT t1.*
FROM yourtable t1
LEFT OUTER JOIN yourtable t2
ON (t1.name = t2.name AND t1.seqnum > t2.seqnum)
WHERE t2.seqnum IS NULL;
回复。德姆斯评论:
如果您只使用GROUP BY name
,那么您的选择列表只能包含name
和聚合函数MIN()
。通常情况下,您确实想要每组出现最小值的整行。
如果你使用TOP
解决方案(或者LIMIT
如果你使用mysql、PostgreSQL、SQLite),那么你不能得到基于name
的多个组的最小值,你只能得到最小值一个name
。
我在 OP 问题的两行之间阅读并猜测他们想要整行,列比问题中显示的列多(总是有),并且所需的查询应该返回多个名称的结果,不止一个。
回复。 SquareCog 的评论:
你建议的解决方案也是join:
SELECT t1.*
FROM yourtable t1
JOIN (SELECT name, MIN(seqnum) AS seqnum FROM yourtable GROUP BY name) t2
USING (name, seqnum);
但是,这个解决方案可能不能使用索引来评估连接,而我给出的解决方案可以。
【讨论】:
与此处的其他建议相比,这似乎过于复杂(Ian Jacobs 如果需要 SET,Richard L 如果需要单个记录)为什么这比其中任何一个更可取? 比尔,“大于”连接的基数是重复次数的指数。最好使用 Ian 的查询作为内部关系,并在 name 和 seqnum 上加入。 @SquareCog:您错误地使用了术语“基数”和“指数”。即使是叉积也是 O(n^2),即多项式。 多哈。你当然是对的。但是,强制这样的连接效率低下的问题仍然存在。 @SquareCog:我明白你的意思,但你的建议解决方案也是一个加入。我们不应该回避 SQL 中的连接——这就是该语言应该使用的方式。【参考方案6】:select name from table t where seq_num = (select max(sequnum) from table tt where t.name = tt.name)
但我更喜欢分组。
【讨论】:
以上是关于如何为最小的列数显示一行?的主要内容,如果未能解决你的问题,请参考以下文章