0

查找执行次数最多的所有司机的执照号码 (LicenseCardNo)。我无法编写 SQL 选择语句来实现这一点。如果你们能提供帮助将不胜感激。下面是关于我的表格和表格内的值的示例数据?我还附上了我到目前为止所做的代码。

 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)。

4

1 回答 1

2

你已经快到那里了。这是使用 Oracle 中的分析函数的一种方法:

with q as (
    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
)
select licenseCardNo
from (select q.*, rank() over (order by Total_No_Trips order by 1 desc) as ranking
      from q
     ) q1
where ranking = 1
ORDER BY LicenseCardNo;

实际上,我也意识到您的原始查询是不必要的复杂。您不需要重新加入 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

在您的原始查询中。这将按计数而不是许可证卡号排序。

另一种(通常效率较低)的方法是使用 group by/join 方法:

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)
于 2012-11-10T16:42:21.067 回答