仅选择成本最低的行

时间:2015-04-01 21:22:18

标签: sql sql-server tsql aggregate-functions

我需要为视图提取一组数据,其中只返回具有最低成本的行。我正在加入3张桌子,他们是大桌子(225万条记录片段给予或拿走)所以表现至关重要。

SELECT  RIC.CarrierName, L.LoadGuid, RIC.RateIQCarrierid, RIRD.Cost
FROM tblLoads L 
INNER JOIN RateIQRecord RIR ON L.LoadGuid = RIR.LoadGuId 
INNER JOIN RateIQCarrier RIC ON RIR.RateIQRecordID = RIC.RateIQRecordID
INNER JOIN RateIQRateDetail RIRD ON RIC.RateIQRecordID = RIRD.RateIQRecordID
AND CAST(L.CreatedDate AS Datetime)  Between '03/3/2014' and '03/3/2014 23:59:59.997'

以下是基于上述代码的数据集示例

CarrierName        LoadGuid                     Carrierid   Cost
Carrier a          FF98010A-90CE-4541-AB88-683645352712 210677951   192.51
Carrier a          FF98010A-90CE-4541-AB88-683645352712 210677921   153.17
Carrier b          FF98010A-90CE-4541-AB88-683645352712 210677925   196.28
Carrier b          FF98010A-90CE-4541-AB88-683645352712 210677947   280.65
Carrier b          FF98010A-90CE-4541-AB88-683645352712 210677949   241.71

这就是我需要的:

CarrierName        LoadGuid                         Carrierid   Cost
Carrier a          FF98010A-90CE-4541-AB88-683645352712 210677921     153.17
Carrier b          FF98010A-90CE-4541-AB88-683645352712 210677925     196.28

1 个答案:

答案 0 :(得分:0)

试试这个: 注意:我假设你有SQL Server 2008或更高版本。 ROW_NUMBER()赢了;否则就行了。

SELECT *
FROM
(
    SELECT  RIC.CarrierName,
            L.LoadGuid,
            RIC.RateIQCarrierid,
            RIRD.Cost,
            --Partition says look at each carrier as a group, then number them in order of cost lowest to highest.
            ROW_NUMBER() OVER (PARTITION BY RIC.CarrierName ORDER BY Cost) rank_num
    FROM tblLoads L 
    INNER JOIN  RateIQRecord RIR 
                ON L.LoadGuid = RIR.LoadGuId 
    INNER JOIN  RateIQCarrier RIC 
                ON RIR.RateIQRecordID = RIC.RateIQRecordID
    INNER JOIN  RateIQRateDetail RIRD 
                ON RIC.RateIQRecordID = RIRD.RateIQRecordID

                --Don't do it this way
                --AND CAST(L.CreatedDate AS Datetime)  Between '03/3/2014' and '03/3/2014 23:59:59.997'

                --Try this instead
                AND CAST(L.CreatedDate AS DATE) = '03/03/2014'
) A
--Only grab the lowest number aka first of row number
WHERE A.rank_num = 1