Sql 使用group by检索主键上的聚合行

Sql 使用group by检索主键上的聚合行,sql,sql-server,sql-server-2005,group-by,aggregate,Sql,Sql Server,Sql Server 2005,Group By,Aggregate,好的,我知道当您使用group by执行SQL命令时,在没有聚合的情况下无法提取特定字段,但在我看来,如果您对保证唯一的主键进行聚合,那么应该有一种方法将该列的其他行与之一起提取。大概是这样的: SELECT Max(id), foo, bar FROM mytable GROUP BY value1, value2 所以ID保证是唯一的,所以foo和bar的值正好是1,有没有办法生成这样的查询 我已经尝试过了,但在本例中,My

好的,我知道当您使用group by执行SQL命令时,在没有聚合的情况下无法提取特定字段,但在我看来,如果您对保证唯一的主键进行聚合,那么应该有一种方法将该列的其他行与之一起提取。大概是这样的:

SELECT Max(id), 
       foo, 
       bar 
FROM   mytable 
GROUP  BY value1, 
          value2 
所以ID保证是唯一的,所以foo和bar的值正好是1,有没有办法生成这样的查询

我已经尝试过了,但在本例中,MyTable有数百万行,并且运行时间不可接受:

SELECT * 
FROM   mytable 
WHERE  id IN (SELECT Max(id) 
              FROM   mytable 
              GROUP  BY value1, 
                        value2) 
       AND ...

理想情况下,我希望有一个至少可以追溯到SQL server 2005的解决方案,但如果在更高版本中有更好的解决方案,我也希望听到这些解决方案。

请确保定义了索引,例如:

CREATE NONCLUSTERED INDEX idx_GroupBy ON mytable (value1, value2)
如果有许多行,则中的可能会变慢。它可能有助于将
中的
转换为
内部联接

SELECT
    data.*
FROM
    mytable data
        INNER JOIN
    (
        SELECT id = MAX(id) 
        FROM mytable 
        GROUP BY value1, 
                 value2
    ) ids
        ON data.id = ids.id
不幸的是,Sql Server没有任何能更好地完成此任务的功能。

请尝试以下操作:

SELECT foo
       ,bar
       ,MAX(ID) OVER(Partition By Value1, Value2 Order by Value1,Value2)
FROM myTable

CREATE NONCLUSTERED INDEX myIndex ON MyTable(Value1,Value2) INCLUDE(foo,bar)

此NCI将覆盖整个查询,因此它根本不需要查找表

据我所知,您当前的解决方案适用于SQL Server 2005之前的版本。第二个查询也将使用
MAX
groupby
,因此它与第一个解决方案相同。因此,这似乎不是一个解决办法。您可能希望查看“partition by”语句。实际上,这将返回foo和bar的所有值,而不仅仅是与max id关联的值。我认为内部连接确实更有意义,但它仍然非常慢,没有在5分钟内完成,因此我取消了它。(我所有的group by列都是非聚集索引)@KDiTraglia-您的group by列是在单个非聚集索引中还是单独索引?如果它们位于单个索引中,那么它们是该索引中唯一的列吗?检查您的查询计划,看看它是否使用了索引。实际上,它们都是单独索引的,我为它们添加了一个索引,这非常有帮助。它仍然不是世界上最快的东西,但至少是可以接受的。谢谢你的提示。