2015-11-10 4 views
0

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

+1

Это будет полезно дать тестовые данные и ожидаемые результаты, которые мы можем использовать? [SQLFiddle] (http://sqlfiddle.com) было бы неплохо. Хорошо начинайте с определения таблиц. –

+0

Привет, это означает, что нужно вернуть два ряда. Один из названных company_name (с именем компании), а другой называется pickups (количество пикапов, которые компания завершила). – cv28

+0

Примеры вставок и ожидаемого результата (возможно, вы могли бы сказать: «Я хочу получить 2 лучших пикапа из этих 4 компаний») помогли бы нам в огромной мере помочь вам. – Boneist

ответ

0

Хм ну я не Oracle, так что я не могу проверить это 100%, но я полагаю, ваш ищет что-то вроде следующего:

Имейте в виду, что при использовании группы вы должны сузить до тех же полей, которые вы группируете в выборе. Надеюсь, это поможет хотя бы дать вам представление о том, на что смотреть.

select TOP 10 
    c.company_name, 
    m.pickup_customer_ref, 
    count(*) as 'count' 
from customer c 
inner join mainfest m on m.pickup_customer_ref = c.reference 
inner join trip t on t.trip_id = m.trip_id 
where t.departure_date < DATEADD(month, -6, GETDATE()) 
group by c.company_name, m.pickup_customer_ref 
order by 'count', c.company_name, m.pickup_customer_ref desc 
+0

Oracle не поддерживает 'TOP',' DATEADD() 'или' GETDATE() '; и псевдонимы столбцов не могут быть в одинарных кавычках ... –

+0

Я знал, что ненавижу оракул по какой-то причине! :-) Ну, есть легкие замены для тех, если они ищут, но суть все та же. – Mercyful

1
SELECT * 
FROM customer 
JOIN (SELECT manifest.pickup_customer_ref reference, 
      DENSE_RANK() OVER (PARTITION BY manifest.pickup_customer_ref ORDER BY COUNT(manifest.trip_id) DESC) rnk 
     FROM manifest 
     INNER JOIN trip ON manifest.trip_id = trip.trip_id 
     WHERE trip.departure_date > TRUNC(SYSDATE) - interval '6' month 
     GROUP BY manifest.pickup_customer_ref) cm ON customer.reference = cm.reference 
WHERE cm.rnk < 11; 

это использует dense_rank для определения порядка или клиентов с наибольшим количеством поездок первого

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