2013-02-07 2 views
0

그룹 (MIN 기능)과 관련 ID에서 minimun을 가져와야합니다.TSQL은 가장 낮은 값의 ID를 얻습니다.

SELECT 
    pv.id, 
    MIN(pv.auto)+MIN(a.autonomia) as autonomia, 
    -->> a.id as minid 
from @autonomie a 
join VARDB v on a.id=v.IDARTICO 
join RIDIBA r on v.id=r.IDVARDB and r.idartico IS NOT NULL 
join @PvTable pv on pv.id=r.IDARTICO 
group by pv.id 

여기서 I는 MIN(a.autonomia) 의해 선택된 필드 autonomia을 계산하지만, 또한 최저 getted a.autonomia 필드와 ID (a.id 필드) 연관을 선택하고 싶다.

+0

'MIN (a.id)'를 의미합니까? 또는'MIN (pv.auto) + MIN (a.autonomia)'을 가진 그 id? 이 경우 같은 쿼리에서'group by pv.id'로 이것을 할 수 없습니다. –

+1

각 ID의 최소값을 원하는 것처럼 들리므로 'MIN (pv.auto + a.autonomia) OVER (PARTITION BY id)'를 사용할 수 있습니다. –

답변

-1

값을 그룹화 한 후 결과 세트를 주문하고 resul 세트에서 최상위 1 개를 얻을 수 있습니다.

SELECT TOP 1 
pv.id, 
MIN(pv.auto)+MIN(a.autonomia) as autonomia, 
-->> a.id as minid 
from @autonomie a 
join VARDB v on a.id=v.IDARTICO 
join RIDIBA r on v.id=r.IDVARDB and r.idartico IS NOT NULL 
join @PvTable pv on pv.id=r.IDARTICO 
group by pv.id 
ORDER BY autonomia 
+1

아니요, 죄송합니다. Min (a.autonomia)가 선택한 a.id (pv.id가 아님)가 필요합니다. – Tobia

0

이 함께 시도 할 수 있습니다 : 당신은이 쿼리를 시도 할 수 있습니다

SELECT pv.id 
     , ROW_NUMBER() OVER (PARTITION BY pv.id ORDER BY pv.auto) pv_auto 
     , ROW_NUMBER() OVER (PARTITION BY pv.id ORDER BY a.autonomia) a_autonomia 
     , a.id a_id 
     , pv.auto 
     , a.autonomia 
INTO #temp 
FROM @autonomie a 
JOIN VARDB v ON a.id=v.IDARTICO 
JOIN RIDIBA r ON v.id=r.IDVARDB and r.idartico IS NOT NULL 
JOIN @PvTable pv ON pv.id=r.IDARTICO 

SELECT temp_pv_auto.id 
     , temp_pv_auto.auto + temp_a_autonomia.autonomia AS autonomia 
     , temp_a_autonomia.a_id 
FROM #temp temp_pv_auto 
JOIN #temp temp_a_autonomia ON 
     temp_pv_auto.id = temp_a_autonomia.id 
AND  temp_pv_auto.pv_auto = 1 
AND  temp_a_autonomia.a_autonomia = 1 

: 업데이트

SELECT pv.id 
     , MIN(pv.auto) pv_auto_min 
     , MIN(a.autonomia) a_autonomia_min 
INTO #temp 
FROM @autonomie a 
JOIN VARDB v ON a.id=v.IDARTICO 
JOIN RIDIBA r ON v.id=r.IDVARDB and r.idartico IS NOT NULL 
JOIN @PvTable pv ON pv.id=r.IDARTICO 
GROUP BY 
     pv.id 


SELECT pv.id 
     , #temp.pv_auto_min + #temp.a_autonomia_min AS autonomia 
     , a.id a_id 
FROM @autonomie a 
JOIN VARDB v ON a.id=v.IDARTICO 
JOIN RIDIBA r ON v.id=r.IDVARDB and r.idartico IS NOT NULL 
JOIN @PvTable pv ON pv.id=r.IDARTICO 
JOIN #temp ON 
     #temp.id = pv.id 
AND  #temp.a_autonomia_min = a.autonomia 
+0

8 분 후에 쿼리를 중단합니다 ... 원래 쿼리는 약 3 초가 걸립니다. – Tobia

+0

좋아요, CTE를 쫓아 냈습니다. 지금은 더 빠를 것입니다. 그렇지 않다면,'ROW_NUMBER'와'PARTITION BY'없이 다시 쓰겠습니다. 다시해볼 수 있니? –

+0

다른 검색어를 추가 했습니까? –

0
SELECT pv.id, 
    MIN(pv.auto)+MIN(a.autonomia) as autonomia, 
    (
     SELECT a2.id from @autonomie a2 
      join VARDB v2 on a2.id=v2.IDARTICO 
      join RIDIBA r2 on v2.id=r2.IDVARDB and r2.idartico IS NOT NULL 
      join @PvTable pv2 on pv2.id=r2.IDARTICO 
     where a2.autonomia = MIN(a.autonomia) 
    ) 
    -->> a.id as minid 
from @autonomie a 
join VARDB v on a.id=v.IDARTICO 
join RIDIBA r on v.id=r.IDVARDB and r.idartico IS NOT NULL 
join @PvTable pv on pv.id=r.IDARTICO 
group by pv.id 

가 하위 쿼리에서 모든 조건을 반영 할 수 있습니다.

+0

하위 쿼리가 조인 제한을 무시하면 MIN (a.autonomia)은 전체 자치 테이블에서 minimun을 가져 오지 않지만이 테이블을 VARDB RIDIBA 및 PvTable과 조인 한 결과입니다. – Tobia

+0

하위 쿼리에서 하나 이상의 레코드가 반환 된 경우 (즉, @ autonomie.autonomia의 행이 둘 이상이면 'MIN (a.autonomia)'값을가집니다.) 'Subquery returned than 1 value'오류가 발생합니다. –

+0

@Tobia, 당신은 그에 따라 하위 쿼리를 바꿀 것입니다. 그래서 조건/조인이 같아야합니다. 하위 쿼리 열이 없으면 어떻게 할 수 있을지 모르겠지만보고 싶습니다. –

0

내가 요구 사항을 이해 완전히 확실하지 않다,하지만 당신은 하위 쿼리로 시도 할 수 있습니다 :

SELECT 
    ,pv.id 
    ,(MIN(pv.auto) + autonomie_min.autonomia) as autonomia 
    ,autonomie_min.id as autonomia_id 
from 
    VARDB v 
    JOIN 
    (
     SELECT 
      a.id 
      ,MIN(a.autonomia) as autonomia 
     FROM 
      @autonomie a 
     GROUP BY 
      a.id 
    ) AS autonomie_min ON 
     (autonomie_min.id = v.IDARTICO) 
    JOIN 
    RIDIBA r ON 
     (r.IDVARDB = v.id) AND 
     (r.idartico IS NOT NULL) 
    JOIN 
    @PvTable pv ON 
     (pv.id = r.IDARTICO) 
GROUP BY 
    pv.id 

하위 쿼리 * autonomie_min * 각과 관련된 autonomia의 모든 최소 값으로 테이블을 생성합니다 신분증.

관련 문제