2017-12-21 2 views
0

fileNumber 및 version을 저장하는 다음 열이있는 테이블이 있습니다.조건에 따라 그룹 당 최대 값

id, fileNumber, version, approved (0/1) . 

동일한 fileNumber의 버전이 여러 개있을 수 있습니다. 특정 파일 번호와 버전이 승인되면 승인 된 열 값은 1이됩니다.

주어진 fileNumber의 max (버전)를 확인하려면 효율적인 쿼리를 작성해야합니다. (우선 순위)에

규칙은 다음과 같습니다

1) 승인 된 버전이있는 경우, 승인 된 버전이없는 경우) =

2 일 승인 최대 (버전)을 얻을, 단순히 최대 (버전)를 얻으십시오

데이타베이스는 오라클입니다. 하위 쿼리가 필요하지 않습니다 오라클 (12C의 +)의

select * from(
    SELECT 
    * 
    FROM 
    table 
    WHERE 
    filenumber = x 
    ORDER BY 
    approved DESC, version DESC 
) a 
WHERE rownum = 1 

나중에 버전 :

+0

where 절은 [approved] 열에 종속되어 있습니까? – glaeran

+0

동일한 FileNumber에 대해 승인 된 버전이 여러 개있을 수 있습니다. 순서대로 나열된 규칙을 적용해야합니다. – user1251226

답변

1

I는 이런 짓을 했을까 :

select filenumber, 
     coalesce(max(case when approved = 1 then version end), 
       max(version) 
       ) as your_max_version 
from t 
group by filenumber; 

오라클에서, 당신은 또한 keep를 사용하여이 작업을 수행 할 수 있습니다

select filenumber, 
     max(version) keep (dense_rank first order by approved desc, version desc) as your_max_version 
from t 
group by filenumber; 

내가 첫 번째 버전은 조금 더 빨리 될 것이라고 추측 것이지만, 보통 keep의 성능에 감동하고 있습니다.

1

이 주문 상단 행을 선택하여 해결하기 위해 아마 간단

SELECT 
    * 
    FROM 
    table 
    WHERE 
    filenumber = x 
    ORDER BY 
    approved DESC, version DESC 
    OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY 
+0

각 파일 번호 버전 _을 반환합니까? –

+0

당신은 각 파일 번호에 대한 버전 번호를 묻지 않았습니다. "주어진 파일 번호를 통해 최대 (버전)을 찾는 효율적인 쿼리를 작성해야합니다."- "주어진 파일 번호"로 당신은 이미 정확히 하나의 파일 번호를 가지고 있으며 명시된대로 규칙에 따라 최대 버전을 찾고 있습니다. –

0

당신이 뭔가를 할 수 같은 :

SELECT fileNumber, 
     COALESCE(max_approved, max_overall) 
FROM (
    SELECT fileNumber, 
      MAX(CASE WHEN approved = 1 THEN version ELSE NULL END) as max_approved, 
      MAX(version) as max_overall 
    FROM table 
    GROUP BY fileNumber 
) 
관련 문제