【发布时间】:2010-11-22 01:02:32
【问题描述】:
请考虑下表:
如您所见,Name 列有一些重复值,其中包含一个类似的组
我需要一个查询,这样我就可以只获取一个组的第一行,如下所示:
请考虑到我需要最快的方法,因为真正的表不是那样的,并且可能有很多数据要以这种方式过滤。
提前致谢。
【问题讨论】:
标签: sql sql-server tsql sql-server-2008 greatest-n-per-group
请考虑下表:
如您所见,Name 列有一些重复值,其中包含一个类似的组
我需要一个查询,这样我就可以只获取一个组的第一行,如下所示:
请考虑到我需要最快的方法,因为真正的表不是那样的,并且可能有很多数据要以这种方式过滤。
提前致谢。
【问题讨论】:
标签: sql sql-server tsql sql-server-2008 greatest-n-per-group
这在很大程度上取决于您如何定义“组中的第一个”
类似这样的:
select name, min(code)
from mytable
group by name
order by name
【讨论】:
假设表名是测试(更改以匹配你的),试试这个
CREATE TABLE [dbo].[test](
[name] [varchar](3) NULL,
[code] [varchar](5) NULL,
[RowNumber] [int] NOT NULL,
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED
(
[RowNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
INSERT INTO [test] ([name],[code],[RowNumber])VALUES('A1','AED',1)
INSERT INTO [test] ([name],[code],[RowNumber])VALUES('A1','BG',2)
INSERT INTO [test] ([name],[code],[RowNumber])VALUES('A1','WS',3)
INSERT INTO [test] ([name],[code],[RowNumber])VALUES('A2','CER',4)
INSERT INTO [test] ([name],[code],[RowNumber])VALUES('A2','HJY',5)
INSERT INTO [test] ([name],[code],[RowNumber])VALUES('A5','OLP',6)
INSERT INTO [test] ([name],[code],[RowNumber])VALUES('A6','LOO',7)
INSERT INTO [test] ([name],[code],[RowNumber])VALUES('A6','AED',8)
SELECT a.*
FROM dbo.test a
INNER JOIN(SELECT name,
MIN(rownumber) AS rownumber
FROM dbo.test
GROUP BY name) b
ON a.name = b.name
AND a.rownumber = b.rownumber
ORDER BY a.name
如果 RowNumber 列始终是连续的,则在该列上放置一个索引。
【讨论】: