Oracle / SQL - возвращение полууникальных записей - PullRequest
2 голосов
/ 21 сентября 2011

я пытаюсь просмотреть таблицу и вернуть полууникальные результаты, основанные на определенном поле. Так, например, с этими данными

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 запись каждого типа сегмента. Другие данные должны поступать из выбранной записи, но какая запись не имеет значения, пока я получаю 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

Надеюсь, это имеет смысл. Кроме того, это будет работать против Oracle, поэтому любой эффективный способ будет превосходным (исходная таблица будет иметь примерно 10 миллионов записей и 30 отдельных сегментов)

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Вы можете сделать что-то вроде

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

Это выберет произвольную строку для каждого SEGMENT.Когда в будущем кто-то решит, что ему все равно, какая строка выбрана, вы можете настроить ORDER BY в аналитической функции.

0 голосов
/ 22 сентября 2011

Если вы не хотите вводить все имена полей:

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

Я не знаю точно, как именно tuple-id / rownumber / object-id вызывается в oracle, но яя уверен, что он существует.

0 голосов
/ 22 сентября 2011

Я знаю, что этот метод работает, когда вы хотите, например, только вернуть столбец сегмента.

    SELECT DISTINCT segment
    FROM YOUR_TABLE_NAME

Но, когда вы попытаетесь сделать запрос следующим образом:

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

Это будетвернуть более одной строки для каждого сегмента с различной информацией в нем.

Эта проблема, похоже, похожа на проблему, найденную здесь .

Прокомментируйте, если я не правильно понимаю вашу проблему =)

...