【问题标题】:Grouping data in SQL ServerSQL Server 中的数据分组
【发布时间】:2010-11-22 01:02:32
【问题描述】:

请考虑下表:

如您所见,Name 列有一些重复值,其中包含一个类似的组 我需要一个查询,这样我就可以只获取一个组的第一行,如下所示:

请考虑到我需要最快的方法,因为真正的表不是那样的,并且可能有很多数据要以这种方式过滤。

提前致谢。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008 greatest-n-per-group


    【解决方案1】:

    这在很大程度上取决于您如何定义“组中的第一个”

    类似这样的:

    select name, min(code)
    from mytable
    group by name
    order by name
    

    【讨论】:

    • 性能一般。你应该考虑在名称、代码列上建立索引
    【解决方案2】:

    假设表名是测试(更改以匹配你的),试试这个

    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 列始终是连续的,则在该列上放置一个索引。

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2011-02-20
      • 2019-05-11
      相关资源
      最近更新 更多