4

好的,所以我知道当您使用 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 的解决方案,但如果在更高版本中有更好的解决方案,我也希望听到它们。

4

2 回答 2

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 没有任何功能可以更好地做到这一点。

于 2012-10-17T16:16:03.077 回答
-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 将覆盖整个查询,因此它根本不需要查找表

于 2012-10-17T16:18:58.093 回答