2015-12-18 3 views
0
SELECT ownerid, zip, vin, make, model FROM listing 
WHERE (ownerid, upper(make)) 
IN (SELECT dealership, attribute FROM ownerproduct WHERE productid = 'FRONT_LISTING') 
AND new = 'Y' 
ORDER BY DBMS_RANDOM.RANDOM; 

Мой запрос производит front_listing. Поскольку он стоит сейчас, он производит только около 85% процента времени, поэтому мне нужно обернуть мой запрос, чтобы получить количество ownerid, make, model, которое должно быть больше 3, чтобы мои результаты запроса отображали front_listing 100% времени.Запрос обертывания, чтобы получить счет больше 3


Edit:

Так мне нужен запрос, где они имеют по крайней мере, более 3-х моделей, связанных с OwnerId и сделать. Так, например, идентификатор владельца может иметь размер модели, который меньше 3, однако у той же модели может быть другой владелец, где у него есть счет больше 3, поэтому мне нужен счет/количество ownerid, make и model должно быть больше 3.

+1

Я добавил таблицу Oracle, потому что синтаксис и функции выглядят как Oracle. –

+0

Ваш вопрос непонятен. Вы хотите включать только строки из «листинга», если они предназначены для владельца, make и модели, у которых есть как минимум три (3) VIN? –

+0

@MatthewMcPeak Я отредактировал свой вопрос. – Robben

ответ

2

Это вы имеете в виду?

SELECT ownerid, zip, vin, make, model 
FROM 
(
SELECT ownerid, zip, vin, make, model, count(*) over (partition by ownerid, make, model) cnt FROM listing 
WHERE (ownerid, upper(make)) 
IN (SELECT dealership, attribute FROM ownerproduct WHERE productid = 'FRONT_LISTING') 
AND new = 'Y' 
) 
WHERE cnt > 3 
ORDER BY DBMS_RANDOM.RANDOM); 
+0

Спасибо! Похоже, ваш запрос работает. Был ли мой вопрос более понятным после редактирования или я должен уточнить немного больше? – Robben

+1

Вы можете отредактировать его, если хотите. Я как бы угадывал, как ваше намерение ... :) Я думаю, что часть замешательства объясняет, почему это дополнительное условие заставит ваш запрос чаще возвращать данные. –

1

Я не уверен, насколько эффективно ваш запрос будет с этим видом WHERE пункта:

WHERE (ownerid, upper(make)) 
    IN (SELECT dealership, attribute FROM ownerproduct WHERE productid = 'FRONT_LISTING') 

Я бы попробовать что-то вроде этого, вместо:

SELECT ownerid, zip, vin, make, model FROM (
    SELECT op.dealership AS ownerid, l.zip, l.vin, l.make, l.model 
     , COUNT(*) OVER (PARTITION BY op.dealership, l.make, l.model) cnt 
     FROM ownerproduct op INNER JOIN listing l 
     ON op.dealership = l.ownerid 
     AND op.attribute = UPPER(l.make) 
    WHERE op.productid = 'FRONT_LISTING' 
     AND l.new = 'Y' 
) WHERE cnt >= 3 
ORDER BY DBMS_RANDOM.VALUE; 

P.S. Причина, по которой я использовал DBMS_RANDOM.VALUE вместо DBMS_RANDOM.RANDOM, заключается в том, что последняя устарела (начиная с 11gR1).

+0

Спасибо! – Robben

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