2013-03-07 4 views
1

У меня есть блок данных, как это:Возврат только первый элемент из соответствующей группы

RW | PK A B C D 
============================ 
1 | 1 aa 123 x 99 
2 | 2 aa 234 v 98 
3 | 3 bb 321 z 11 
4 | 4 bb 210 w 91 
5 | 5 cc 456 y 55 

Как я могу захватить только первый элемент каждого набора (опознали по колонке А), как так?

RW | A B C D 
======================= 
1 | aa 123 x 99 
2 | bb 321 z 11 
3 | cc 456 y 55 

Я могу GROUP BY или использовать DISTINCT, но это очень неэффективно с тем, что я смотрю на, во время работы прямой список занимает меньше 100msecs. Два вышеупомянутых параметра также могут выдавать более одного экземпляра экземпляра элемента в столбце A, поскольку соответствующие значения могут отличаться.

Другими словами,

SELECT MYTABLE.A, MYTABLE.D, MYTABLE.D, MYTABLE.D 
FROM MYTABLE 

очень быстро (менее чем за секунду), в то время как

SELECT MYTABLE.A, MYTABLE.D, MYTABLE.D, MYTABLE.D 
FROM MYTABLE 
GROUP BY MYTABLE.A, MYTABLE.D, MYTABLE.D, MYTABLE.D 

и

SELECT DISTINCT MYTABLE.A, MYTABLE.D, MYTABLE.D, MYTABLE.D 
FROM MYTABLE 

занимает гораздо больше количество времени (минуты , но я не позволил ему закончить).

Мне не нужны агрегированные функции (COUNT, SUM и т. Д.), Просто листинг, один раз за элемент. Количество вхождений на значение в столбце А меняется, поэтому я не могу просто захватить каждую строку x.

Почему я просто не запускаю список и не использую Excel или что-то в этом роде? Я смотрю несколько миллионов записей, которые нужно вернуть, и я не могу обрабатывать так много записей, используя любое программное обеспечение, с которым я знаком.

ответ

4

Это звучит, как вы хотите что-то вроде

SELECT pk, 
     a, 
     b, 
     c, 
     d 
    FROM(SELECT pk, 
       a, 
       b, 
       c, 
       d, 
       row_number() over (partition by a order by pk asc) rnk 
      FROM your_table) 
WHERE rnk = 1 
+0

Это выглядит, как он будет возвращать правильные результаты, но это по-прежнему занимает значительное количество времени, чтобы выполнить , Возможно, я прошу слишком много, но есть ли более быстрый метод? – Gaffi

+0

@ Gaffi - Что означает «значительное количество времени»? Предположительно, Oracle придется выполнять полное сканирование таблицы (или полное сканирование индекса покрытия в зависимости от выбранных столбцов), и будет некоторая сортировка. Если запрос вернет миллионы строк, это означает, что таблица содержит десятки миллионов строк, поэтому сканирование таблицы вряд ли будет мгновенным. С другой стороны, если таблица имеет размер в несколько ГБ, для выполнения запроса не должно хватить нескольких часов, если у вас нет серьезных проблем ввода-вывода. –

+0

Я имею в виду «существенный» в том, что прямая тяга всех записей меньше секунды, но группировка/сортировка занимает минуты. Я запускаю запрос сейчас, и я не знаю, сколько времени это займет в целом, но я обновлю его, когда это будет сделано. – Gaffi

0

Попробуйте это тоже ..

select * from table where rowid in (select min(rowid) from table group by a); 
+0

'try this' - не правильный ответ. Опубликуйте комментарий вместо этого. –

Смежные вопросы