这个问题很复杂,所以示例效果最好......我有关于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))
。这会返回一个数字。我希望将实际数据放入我的数据集中。
有谁知道这是怎么做到的吗?
答案 0 :(得分:14)
select Name, MIN(SEQNUM)
from TABLE
Group By Name
答案 1 :(得分:3)
我相信这就是你想要的:
select NAME, min(SEQNUM) as SEQNUM
from TABLE
group by NAME
答案 2 :(得分:2)
SELECT TOP 1 Name, SeqNum FROM yourtable ORDER BY SeqNum DESC
将显示SeqNum
最高的那个答案 3 :(得分: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,我认为它会更加清晰。
答案 4 :(得分: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
解决方案(如果使用MySQL,PostgreSQL,SQLite,则为LIMIT
),那么基于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);
但是,这个解决方案可能无法使用索引来评估连接,而我给出的解决方案可以。
答案 5 :(得分:0)
从表t中选择名称seq_num =(从表tt中选择max(sequnum),其中t.name = tt.name)
但我更喜欢分组。