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

时间:2012-10-17 15:31:15

标签: 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个值,有没有办法生成这样的查询?

我试过这个,但是MyTable在这种情况下有数百万行,而且运行时间是不可接受的:

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

理想情况下,我想要一个至少可以在SQL Server 2005上运行的解决方案,但如果在更高版本中有更好的解决方案,我也希望听到它们。

2 个答案:

答案 0 :(得分:3)

确保您已定义索引,例如:

CREATE NONCLUSTERED INDEX idx_GroupBy ON mytable (value1, value2)
如果你有很多行,

IN可能会很慢。将IN转换为INNER JOIN可能会有所帮助。

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没有任何更好的功能。

答案 1 :(得分:-1)

试试这个:

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将涵盖整个查询,因此无需查找所有