2011-09-21 3 views
2

내가하려는 것은 테이블을 통과하여 특정 필드를 기반으로 한 세미 고유 결과를 반환하는 것입니다. 예를 들어이 데이터로 예를 들어오라클/SQL - 반품 고유 레코드 반환

field1 segment  field2 field3 field4 etc 
----------------------------------------------- 
xxxx S1   xxx  xxx  xxx  xxx 
xxxx S4   xxx  xxx  xxx  xxx 
xxxx S1   xxx  xxx  xxx  xxx 
xxxx S2   xxx  xxx  xxx  xxx 
xxxx S2   xxx  xxx  xxx  xxx 
xxxx S1   xxx  xxx  xxx  xxx 
xxxx S3   xxx  xxx  xxx  xxx 

내가 원하는 것은 모든 세그먼트 유형의 1 레코드를 반환하는 것입니다. 다른 데이터는 선택된 레코드에서 가져와야하지만 각 세그먼트 유형에 대해 고유 한 레코드가 하나만있는 한 어떤 레코드인지는 중요하지 않습니다.

field1 segment  field2 field3 field4 etc 
----------------------------------------------- 
xxxx S1   xxx  xxx  xxx  xxx 
xxxx S4   xxx  xxx  xxx  xxx 
xxxx S2   xxx  xxx  xxx  xxx 
xxxx S3   xxx  xxx  xxx  xxx 

바라건대 말이 되겠지. 가장 효율적인 방법이 좋을 것 할 무엇, 그래서 또한이

답변

2

당신은

SELECT segment, 
     field1, 
     field2, 
     field3, 
     field4 
    FROM (SELECT segment, 
       field1, 
       field2, 
       field3, 
       field4, 
       row_number() over (partition by segment order by rownum) rnk 
      FROM table_name) 
WHERE rnk = 1 

이 뭔가를 할 수있다 (소스 테이블은 10 만 개 달러 기록과 30 개 별개의 세그먼트 뭔가를해야합니다) 오라클에 대해 실행됩니다 각 SEGMENT에 대해 임의의 행을 선택합니다. 나중에 누가 행을 선택했는지 결정할 때 결정하면 분석 함수에서 ORDER BY를 조정할 수 있습니다.

0

이 기술은 예를 들어 세그먼트 열만 반환하려는 경우에 효과적이라는 것을 알고 있습니다.

SELECT DISTINCT segment 
    FROM YOUR_TABLE_NAME 

하지만, 당신이 시도하고 그래서 쿼리 : 이것은 다른 정보와 각 세그먼트에 대해 둘 이상의 행을 반환합니다

SELECT DISTINCT SEGMENT, FIELD2, FIELD3 
    FROM YOUR_TABLE_NAME 
    WHERE BLAH = BLAH 

.

이 문제는 발견 된 문제와 다소 비슷합니다. here 내가 정확하게 문제를 이해하고 있지 않다 경우 의견을주십시오

=)

0

모든 필드 이름을 입력하지 않으려면 :

SELECT * 
FROM table_name t0 WHERE NOT EXISTS (
    SELECT * FROM table_name t1 
    WHERE t1.segment = t0.segment 
    AND t1.ROWNUM < t0.ROWNUM 
    ; 

나도 몰라 정확히 어떻게 정확히 튜플 -id/rownumber/object-id가 oracle에서 호출되었지만 그것이 존재한다고 확신합니다.

+0

이 작업을 수행 할 수 있지만 일반적으로 't. *, rownum을 RN from t'를 하위 쿼리로 선택해야한다고 생각합니다. – FrustratedWithFormsDesigner

관련 문제