2

这个问题很复杂,所以例子效果最好......我有下表关于 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)). 这会返回一个数字。我希望将实际数据放入我的数据集中。有谁知道这是怎么做到的吗?

4

6 回答 6

14
select Name, MIN(SEQNUM)
from TABLE
Group By Name
于 2009-01-29T16:08:19.753 回答
3

我相信这就是你想要的:

select NAME, min(SEQNUM) as SEQNUM
from TABLE
group by NAME
于 2009-01-29T16:45:35.060 回答
2
SELECT TOP 1 Name, SeqNum FROM yourtable ORDER BY SeqNum DESC

将显示具有最高 SeqNum 的那个

于 2009-01-29T16:06:27.963 回答
1

将 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 会更清楚发生了什么。

于 2009-01-29T23:11:46.577 回答
0
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 的评论:

您建议的解决方案也是一个连接:

SELECT t1.*
FROM yourtable t1
  JOIN (SELECT name, MIN(seqnum) AS seqnum FROM yourtable GROUP BY name) t2
  USING (name, seqnum);

但是,这个解决方案可能不能使用索引来评估连接,而我给出的解决方案可以。

于 2009-01-29T16:41:19.623 回答
0

select name from table t where seq_num = (select max(sequnum) from table tt where t.name = tt.name)

但我更喜欢分组一个。

于 2009-01-29T16:47:15.043 回答