0

我有 3 个名为 Contracts、Bills 和 Companies 的表,我在内部加入了一个名为“ContractID”的值,该值链接了所有 3 个表。我的查询运行良好,但是我只想提取最新的结果。ContractID 字段可以从 Contract 表返回多个具有不同日期的结果,因此 DISTINCT 无法缩小范围。

当前查询如下:

SELECT cn.ContractID
    , cn.Vendor
    , cn.ContractDate
    , b.ContractID
    , b.TotalBill
    , b.CurrentDue
    , cm.ContractID
    , cm.CompanyID
    , cm.[Description]
FROM [Contract] cn
INNER JOIN Company cm
    ON cn.ContractID = cm.ContractID
INNER JOIN Bill b
    ON cn.ContractID = b.ContractID

我正在使用 MSSQLServer 2005。有人可以帮我调整查询,使其只返回每个 ContractID 的最新 ContractDate 结果吗?

4

2 回答 2

4

如果您的查询按您想要的方式排序,您只需将 select Top 1 添加到您的查询中,这将为您提供第一行:

SELECT Top 1 cn.ContractID , cn.Vendor , cn.ContractDate , b.ContractID 
     , b.TotalBill, b.CurrentDue, cm.ContractID, cm.CompanyID, cm.[Description] 
  FROM [Contract] cn 
 INNER JOIN Company cm ON cn.ContractID = cm.ContractID 
 INNER JOIN Bill b ON cn.ContractID = b.ContractID 
 order by cn.ContractDate DESC 
于 2012-11-26T21:11:25.827 回答
1

使用RANK() OVER给每个 ContractID 一个排名,然后只选择排名为 1 的那些。例如:

SELECT * 
FROM
(
    SELECT      
        Contract.ContractID, 
        Contract.Vendor, 
        Contract.ContractDate, 
        Bill.ContractID, 
        Bill.TotalBill,
        Bill.CurrentDue, 
        Company.ContractID, 
        Company.CompanyID, 
        Company.Description,
        RANK() OVER (ORDER BY ContractDate DESC) as RecordRank
    FROM Contract
    INNER JOIN Company 
        ON Contract.ContractID = Bill.ContractID
    INNER JOIN Bill 
        on Company.ContractID = Bill.ContractID
) qry
WHERE RecordRank = 1
于 2012-11-26T21:16:32.150 回答