2013-11-21 2 views
1

У меня этот запрос (Oracle 11g):Oracle Как использовать отличие от одной колонки

SELECT 
    distinct to_number(val.number_value), val.variant_number 
from 
    val 
left join 
    mad on mad.id = val.madid 
where 
    val.id = 227753377 and mad.fk_parent =18468 
    and (val.language_id = 6003 or val.language_id is null) 
    and mad.identifier = 'IDENTIFIER2' 
order by val.variant_number 

Который возвращает меня:

0 | 1 
0 | 2 
0 | 3 
0 | 4 
0 | 5 

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

Что мне нужно в этом случае выше этот результат:

0 | 1 

Но в этом другом примере он должен дать мне:

0 | 1 
1 | 2 
2 | 3 

Если val.number_value является дубликатом, то он должен игнорироваться и возвращать мне только 1 строку для этого. Как это сделать?

ответ

2

Если для каждого number_value вы хотите только один variant_number, вы можете использовать group by и некоторую агрегатную функцию (например, мин/макс):

SELECT 
    to_number(val.number_value), min(val.variant_number) 
from 
    val 
left join 
    mad on mad.id = val.madid 
where 
    val.id = 227753377 and mad.fk_parent =18468 
    and (val.language_id = 6003 or val.language_id is null) 
    and mad.identifier = 'IDENTIFIER2' 
group by to_number(val.number_value) 
+0

спасибо. Для меня это самый простой способ. – frgtv10

2
with numbers as (
    SELECT to_number(val.number_value) as number_value, 
     val.variant_number, 
     row_number() over (partition by val.number_value order by val.variant_number) as rn 
    from val 
    left join mad on mad.id = val.madid 
    where val.id = 227753377 and mad.fk_parent =18468 
    and (val.language_id = 6003 or val.language_id is null) 
    and mad.identifier = 'IDENTIFIER2' 
    order by val.variant_number 
) 
select number_value, 
     variant_Number 
from numbers 
where rn = 1; 

Изменяя order by в оконной функции, вы можете «настроить», какую строку взять из дубликатов.

+0

Спасибо за вашу помощь, но получил ошибку в «order by»: отсутствует выражение ORDER BY в спецификации окна – frgtv10

+1

@ frgtv10 - в аналитической статье было слишком много скобок; вы хотите попробовать это снова? (Хотя использование агрегата 'min()' будет иметь такой же эффект здесь, это дает вам большую гибкость, если ваше требование о том, какая из повторяющихся строк для выбора сложнее, например, используя поле даты, которое не включено в ' select'). –

+0

@AlexPoole: спасибо за исправление моих опечаток. Я изначально забыл заказ, но, добавляя его, я испортил код;) –

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