如何为最小的列数显示一行?

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)

但我更喜欢分组。

【讨论】:

以上是关于如何为最小的列数显示一行?的主要内容,如果未能解决你的问题,请参考以下文章

具有基于视口的列数的 Bootstrap 4 卡片组

如何为单个列中存在的值添加多个条件并将结果显示在单独的列中?

grep命令详解

shell脚本应用练习

grep使用集合

grep和egrep的用法及解释说明