0

所以我有 3 张桌子:

停车区 -

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”的最大“成本”的ID和CID,换句话说,我需要找到最大“maxprice”的ZID,然后找到该ID和CID与“ZID”相关的最大“成本”

所以我设法找到了与 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”是行不通的。

例如:

例子

continue_of_example 我怎样才能做到这一点?谢谢

4

1 回答 1

1

这将是我的方法:首先,使用dense_rank 选择所有具有maxprice 的ZID。接下来,使用第二个 dense_rank 从所选 ZID 中获取所有 CID 和最高成本。最后,使用找到的 CID 获取汽车数据。

这给出了所有具有最高 maxprice 的批次中成本最高(相等)的所有汽车的 CID 和 ID。

如果dense_rank 对你来说是新的,你可以在这里阅读

收集在一个查询中:

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 和 3,它们都具有最高的 maxprice。下一步获取 CID 1010 和 1011,它们是在 parkzoneID 的 1 和/或 3 上成本最高的汽车。最后一步返回 CID/ID 组合的 1010/2000 和 1011/2001。您提供的结果实际上是错误的,因为 CID 1014 的成本为 10,而其他两个有 20。

如果您的意思是每个parkingzoneID 的最大成本,那么问题不是很清楚,但您只需更改一行:

, DENSE_RANK() over (PARTITION BY ZID ORDER BY Cost DESC) AS orderedCosts

这也将返回汽车 1014/2004

于 2018-12-10T00:00:08.123 回答