所以我有3张桌子:
parkingZone-
ZID - zone id
Name - name of the zone
maxprice - max price of the parking zone
pricePerHour
停车场-
CID - the id of the car which parking
StartTime - start time of parking
EndTime - end time of parking
ParkingZoneID - zone ID (same as ZID in parkingzone)
Cost - how much the paking costed
汽车-
CID - same as CID in carParking
ID - ID of who owns the car
cellPhone - cellPhone of who ownsthe car
现在我需要找到谁拥有最大“ maxprice”的最大“ cost”的ID和CID, 换句话说,我需要找到最大“ maxprice”的ZID 然后找到与“ ZID”相关的最大“费用”的ID和CID
所以我设法找到了与ZID相关的所有CID:
select CarParking.CID, CarParking.Cost
from CarParking
inner join (select ParkingArea.AID
from ParkingArea
inner join(
select max(ParkingArea.maxpriceperday) maxpriceperday
from ParkingArea
)maxrow on maxrow.maxpriceperday = ParkingArea.maxpriceperday)maxCid on maxCid.AID= CarParking.ParkingAreaID
但是如何获得最高费用,然后从Cars表中获得CID和ID?
重要说明-“ maxpriceperday”和“ Cost”中的最大值不能超过一个 这意味着maxpriceperday可能有一个以上的ZID(如果它们相等) 如果这些费用相等,则每个ZID的最大CID不得超过一个。
因此无法使用“ TOP”或“ LIMIT”。
例如:
答案 0 :(得分:1)
这是我的方法: 首先,使用density_rank选择所有具有maxprice的ZID。接下来,使用第二个density_rank获取所有CID,并从选定的ZID获得最高的成本。最后,使用找到的CID获取汽车数据。
这给出了在最高价格最高的所有批次中,具有最高(相等)成本的所有汽车的CID和ID。
如果density_rank对您来说是新手,您可以阅读有关here
的信息在一个查询中收集:
SELECT CID
, ID
FROM Cars AS C
INNER JOIN (
SELECT CID
, Cost
, DENSE_RANK() over (ORDER BY Cost DESC) AS orderedCosts
FROM carParking AS CP
INNER JOIN (SELECT ZID
, DENSE_RANK() over (ORDER BY maxprice DESC) AS orderedMaxprice
FROM ParkingArea
) AS PA
ON PA.ZID= CP.ParkingAreaID
AND orderedMaxprice = 1
) as cars_most_costs
ON cars_most_costs.CID = C.CID
AND cars_most_costs.orderedCosts = 1
dense_rank的工作方式如下:
ZID | maxprice| dense_rank
1 | 1000 | 1
3 | 1000 | 1
2 | 500 | 2
4 | 400 | 3
使用您的论文示例: 第一步是ZID 1和ZID 3,两者的最高价格都最高。 下一步将获得CID 1010和1011,这是停车位ID为1和/或3的最高费用的汽车。 最后一步返回CID / ID组合的1010/2000和1011/2001。 您提供的结果实际上是错误的,因为CID 1014的成本为10,而其他两个的成本为20。
如果您的意思是每个停车区ID的最高费用,那么问题不是很清楚,但是您只需要更改一行:
, DENSE_RANK() over (PARTITION BY ZID ORDER BY Cost DESC) AS orderedCosts
这也将返还1014/2004汽车