好的,所以我知道当你用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上运行的解决方案,但如果在更高版本中有更好的解决方案,我也希望听到它们。
答案 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将涵盖整个查询,因此无需查找所有
表