2012-10-17 3 views
1

좋아, 그룹별로 SQL 명령을 수행 할 때 집계가없는 특정 필드를 가져올 수는 없다는 것을 알았지 만 집계를 수행하는 경우 나에게 보이는 것처럼 보입니다. 고유 한 것으로 보장되는 기본 키에는 해당 열의 다른 행을 가져 오는 방법이 있어야합니다. 이런 식으로 뭔가 :그룹이있는 기본 키에서 집계 행 검색

SELECT Max(id), 
     foo, 
     bar 
FROM mytable 
GROUP BY value1, 
      value2 

그래서 ID가 고유 보장, 그래서 foo는 바 정확히 1 값을가집니다,이 같은 쿼리를 생성하는 방법은 무엇입니까?

내가 이것을 시도하지만,이 경우 MyTable에 행 수백만을 가지고 있으며, 이것에 대한 런타임은 받아 들일 수 : 멀리 거슬러

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

가 이상적으로 적어도 작동하는 솔루션을 싶습니다 SQL 서버 2005,하지만 이후 버전에서 더 나은 솔루션이 있다면 그들도 듣고 싶습니다.

CREATE NONCLUSTERED INDEX idx_GroupBy ON mytable (value1, value2) 

IN 당신이 많은 행이있는 경우 속도가 느린 경향이 될 수

+0

에서 테이블을 조회 할 필요가 없습니다 있도록

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는 전체 쿼리를 다룰 것입니다 알아. 그리고 두 번째 질의는'GROUP BY '와 함께'MAX'를 사용할 것이므로 첫 번째 해결 방법과 같습니다. 그래서 그것은 주위의 일로 보이지 않습니다. –

+0

"partition by"문을보고 싶을 수도 있습니다. – jt234

답변

3

는 인덱스와 같은 정의했는지 확인하십시오. ININNER 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에는이 기능을 향상시키는 기능이 없습니다.

+0

내부 결합이 좀 더 의미가 있다고 생각하지만, 여전히 잔인하게 느리고 5 분 내에 완료되지 않고 취소되었습니다. (모든 열에 의한 그룹은 클러스터되지 않은 인덱스입니다.) –

+1

@KDiTraglia - 단일 비 클러스터형 인덱스의 열 단위이거나 개별적으로 인덱싱되는 그룹입니까? 단일 인덱스에있는 경우 해당 인덱스의 유일한 열입니까? 쿼리 계획을 확인하여 인덱스를 전혀 사용하고 있는지 확인하십시오. –

+0

사실 그들은 그것들을 모두 따로 색인화 했었습니다. 나는 그것들 모두에 대한 색인을 추가했는데 그것은 대단히 도움이되었습니다. 아직 세계에서 가장 빠른 것은 아니지만 적어도 받아 들일 만하다. 팁 고마워. –

-1

이 시도 : 그것은 현재 솔루션은 지금까지와 같은 SQL Server 2005의 이전 버전 일 모든

+0

사실, 최대 ID와 관련된 값뿐만 아니라 foo 및 bar의 모든 값을 반환합니다. –