2012-11-10 19 views
0

查找執行次數最多的所有司機的許可證編號(LicenseCardNo)。我無法編寫SQL select語句來實現此目的。希望你們能幫忙。以下是關於我的表格和表格內的值的示例數據?我還附上了我迄今爲止所做的代碼。如何獲得最大次數的旅行

DRIVER(OwnerNo, LicenseCardNo,STATUS,) 
PRIMARY KEY(OwnerNo) 
UNIQUE(LicenseCardNo) 
FOREIGN KEY(OwnerNo) REFERENCES EMPLOYEE(OwnerNo) 
CHECK (STATUS IN ('MAIN DRIVER', 'DRIVER', 'TAXI DRIVER'))) 

(A29, DR1, 'MAIN DRIVER') 
(A28, DR2, 'MAIN DRIVER') 
(A25, DR3, 'TAXI DRIVER') 
(A25, DR22, 'DRIVER') 
(A20, DR6, 'DRIVER') 
(A23, DR7, 'TAXI DRIVER') 
(A30, DR8, 'TAXI DRIVER') 

TRIP(TripNo,LicenseCardNo,CarReg,TRIP_DATE,) 
PRIMARY KEY (TripNo), 
FOREIGN KEY (LicenseCardNo) REFERENCES DRIVER(LicenseCardNo), 
FOREIGN KEY (CarReg) REFERENCES TRUCK(CarReg) 

(1, DR1, 'SJG123', ADD_MONTHS(TRUNC(SYSDATE),0)-135) 
(2, DR2, 'GBC222', ADD_MONTHS(TRUNC(SYSDATE),0)-135) 
(3, DR1, 'GBC270', ADD_MONTHS(TRUNC(SYSDATE),0)-133) 
(4, DR3, 'SJG123', ADD_MONTHS(TRUNC(SYSDATE),0)-130) 
(5, DR22, 'SJG123', ADD_MONTHS(TRUNC(SYSDATE),0)-130) 
(6, DR22, 'GBC222', ADD_MONTHS(TRUNC(SYSDATE),0)-124) 
(7, DR7, 'KKK007', ADD_MONTHS(TRUNC(SYSDATE),0)-123) 
(8, DR1, 'SJG123', ADD_MONTHS(TRUNC(SYSDATE),0)-123) 
(9, DR2, 'QRT834', ADD_MONTHS(TRUNC(SYSDATE),0)-123) 
(10, DR22, 'GBC270', ADD_MONTHS(TRUNC(SYSDATE),0)-122) 

這是我能走多遠。不知道如何繼續。我設法通過互聯網獲得一些幫助。請指教。

SELECT DRIVER.LicenseCardNo AS LICENSE_NO, COUNT(TRIP.TripNo) AS TOTAL_NO_TRIPS 
FROM DRIVER LEFT OUTER JOIN TRIP ON DRIVER.LicenseCardNo = TRIP.LicenseCardNo 
GROUP BY DRIVER.LicenseCardNo 
ORDER BY DRIVER.LicenseCardNo; 

此代碼列出了每個駕駛員旅行的行程數。

因此,現在我需要找出執行最大行程次數的所有司機的許可證編號(LicenseCardNo)。

回答

2

你幾乎在你的路上。這裏有一種方法,使用Oracle中的分析函數:其實,我也意識到你原來的查詢是不必要的複雜。由於您擁有許可證編號,因此您不需要連接回DRIVER。你可以表達這種爲:

select licenseCardNo 
from (select q.*, rank() over (order by Total_No_Trips order by 1 desc) as ranking 
     from (select LicenseCardNo, count(*) as Total_No_Trips 
      from trips t 
      group by LicenseCardNo 
      ) q 
    ) q1 
where ranking = 1 
ORDER BY LicenseCardNo; 

另外,如果你只是想先看到輸出的最大數,那麼你可以做:

order by 2 desc 

在原始查詢。這將通過計數而不是許可證卡號進行排序。

另一個(通常較少efficien)筆的方式來做到這一點是跟團由/加入方法:

with q as (
    select LicenseCardNo, count(*) as Total_No_Trips 
    from trips t 
    group by LicenseCardNo 
) 
select q.* 
from q 
where Total_No_Trips = (select max(Total_No_Trips) from q) 
+0

謝謝,但我怎麼能實現用普通的SQL代碼 –

+0

我想做出碼容易使即將接管的人可以理解。不知道他是否擅長甲骨文。 –

+0

你可以使用group by和join來做同樣的事情。但是,排名函數*現在是SQL標準的一部分;他們已經是Oracle十多年的一員;而且,它們通常比通過/ join方法的組更有效。 –