2009-01-29 54 views
2

这个问题是如此复杂的例子会工作最棒的,我对ODBC下表,不SQL Server管理如何显示一列中最低数量的一行?

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))。这返回一个数字。我希望将实际数据放入我的数据集中。 是否有人知道如何做到这一点?

+0

您只对一行或一行/名称感兴趣吗? – 2009-01-29 16:12:56

+0

你想要什么结果显示?我仍然对你想要完成的事情感到困惑。 – 2009-01-29 19:20:32

回答

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; 

回复。 Dems的评论:

如果您只是使用GROUP BY name那么您的选择列表只能包括name和聚合函数MIN()。通常情况下,您确实希望每个组出现最小值的整行。

如果使用TOP溶液(或LIMIT如果你使用MySQL和PostgreSQL,SQLite的),那么你就不能获得基于name最低为多个组,你只能得到最低的一个name

我在OP的问题的各行之间阅读,并猜测他们希望整行,有比问题中显示的列更多的列(总是有),并且所需的查询应返回多个名称的结果,而不仅仅是一个。


Re。 SquareCog的评论:

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

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

然而,这种解决方案可能无法使用索引来评估加盟,而解决办法我给即可。

2
SELECT TOP 1 Name, SeqNum FROM yourtable ORDER BY SeqNum DESC 

将显示一个具有最高序号(SeqNum)

+0

通过切换排序顺序可以获得最低限度 – cdeszaq 2009-01-29 16:08:58

+0

您将只获得1行,1个名称,并非所有名称根据需要 – 2009-01-29 16:21:24

+0

这将与SQL服务器管理。我正在使用odbc – MrM 2009-01-29 16:22:51

14
select Name, MIN(SEQNUM) 
from TABLE 
Group By Name 
3

我相信这是你想要什么:

select NAME, min(SEQNUM) as SEQNUM 
from TABLE 
group by NAME 
0
从表T

选择名称,其中SEQ_NUM =(选择列表TT最大(sequnum),其中t.name = tt.name)

但我更喜欢分组。

1

把伊恩和比尔的答案放在一起给你提供了两全其美的方法 - 获得完整的记录,而不必做一个潜在的非常昂贵的连接(任何连接都不是一个equijoin可以把事情吹得像你一样,相信)。

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 

您也可以使用连接语法来达到相同的结果(而不是在哪里),但在这种情况下,我认为这是一个更清晰一点发生了什么事情,如果你使用的位置。