我有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结果吗?
答案 0 :(得分:4)
如果您的查询按照您希望的方式进行排序,您只需在查询中添加选择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
答案 1 :(得分: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