在选择函数中获得最大值max

时间:2018-12-09 22:46:10

标签: sql sql-server aggregate-functions

所以我有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”。

例如:

example

continue_of_example 我该怎么做? 谢谢

1 个答案:

答案 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汽车