Sql 返回列具有最小值的行
我有一个设想Sql 返回列具有最小值的行,sql,sql-server,reporting-services,ssrs-2008,Sql,Sql Server,Reporting Services,Ssrs 2008,我有一个设想 Key Name Amt 101 Nikh 100 101 Mark 150 101 Jess 75 102 Sam 200 102 Lee 150 请注意,多个记录的键是相同的。此外,它来自与Name和Amt不同的表。我想返回具有最低金额的记录。以下是示例: Key Name Amt 101 Jess 75 102 Lee 150 到目前为止,我已经运行了一个返回Key和Amt记录的代码,如何添加Name列并确保它返回与minAmt关联的名称 Pl注:我正在
Key Name Amt
101 Nikh 100
101 Mark 150
101 Jess 75
102 Sam 200
102 Lee 150
请注意,多个记录的键是相同的。此外,它来自与Name和Amt不同的表。我想返回具有最低金额的记录。以下是示例:
Key Name Amt
101 Jess 75
102 Lee 150
到目前为止,我已经运行了一个返回Key和Amt记录的代码,如何添加Name列并确保它返回与minAmt关联的名称
Pl注:我正在研究SSRS 2008
为了更好地理解,我将代码粘贴到此处:
SELECT A.AppID,A.AppDetailID, MIN(B.Amt) AS LOWAmt
FROM AppDetail AS A
LEFT OUTER JOIN
(SELECT TOP (100) PERCENT C.AppID, C.PartyID, MIN(C.TotalScore) AS Amt, D.Name, D.Indicator, E.FirstName, E.LastName
FROM DetailGuarantor AS D RIGHT OUTER JOIN
Applicant AS E ON D.BeginDate = E.BeginDate AND
D.PartyID = E.PartyID AND
D.AppID = E.AppID RIGHT OUTER JOIN
ApplicationScore AS C ON
E.AppID = C.AppID AND
E.PartyID = C.PartyID
GROUP BY C.AppID, C.PartyID, D.Name, D.Indicator, E.FirstName, E.LastName,
ORDER BY C.AppID, Amt) AS B ON A.AppID = B.AppID
GROUP BY A.AppID,A.AppDetailID
您应该使用行号来实现此目的:
您应该使用行号来实现此目的:
经典问答
;WITH CTE as
(
SELECT row_number() over (partition by [Key] order by Amt) rn,
[Key],
Name,
Amt
FROM <table>
)
SELECT [Key], Name, Amt
FROM CTE
WHERE rn = 1
编辑:如果在平局的情况下,您希望以最低金额显示所有结果,请将行编号替换为秩经典问答
;WITH CTE as
(
SELECT row_number() over (partition by [Key] order by Amt) rn,
[Key],
Name,
Amt
FROM <table>
)
SELECT [Key], Name, Amt
FROM CTE
WHERE rn = 1
编辑:如果在平局的情况下,您希望以最低金额显示所有结果,请将行编号替换为秩如果您只需要一个简单的查询,那么以下是一种方法:
SELECT Tab.KeyID, Tab.Name, Tab.Amt
FROM Tab
INNER JOIN (SELECT MIN(Amt) as 'minAmt', [KeyID]
FROM Tab
GROUP BY [KeyID]) lowestAmt
ON Tab.KeyID = lowestAmt.KeyID
WHERE Tab.Amt = lowestAmt.minAmt
GROUP BY Tab.KeyID, Tab.Name, Tab.Amt
ORDER BY Tab.KeyID
你可以在这里看到->
希望这有帮助 如果您只需要一个简单的查询,那么以下是一种方法:
SELECT Tab.KeyID, Tab.Name, Tab.Amt
FROM Tab
INNER JOIN (SELECT MIN(Amt) as 'minAmt', [KeyID]
FROM Tab
GROUP BY [KeyID]) lowestAmt
ON Tab.KeyID = lowestAmt.KeyID
WHERE Tab.Amt = lowestAmt.minAmt
GROUP BY Tab.KeyID, Tab.Name, Tab.Amt
ORDER BY Tab.KeyID
你可以在这里看到->
希望这有帮助 与类似,不同的是,您要查找的是最小值而不是最大值。您的意思是表A、B、C、D、E是视图表,然后是因为误解了您的问题。不,这不是一个类似于的视图,不同的是,您要查找的是最小值而不是最大值。您的意思是表a、B、C、D、E是视图表,然后是因为误解了您的问题。不,这不是一个视图我不认为这与OP想要的输出类似?Jerry-你应该阅读/了解排名函数。他们会让你的生活更轻松。你会感谢我的later@t-克劳森:我意识到我犯了一个错误。谢谢我已经相应地编辑了我的答案。@t-clausen.dk您现在看到这有什么问题吗?您正在强制使用“带领带”,您的脚本不容易阅读。你的表现不会达到最佳状态,我不认为这与OP想要的输出类似?Jerry-你应该阅读/了解排名函数。他们会让你的生活更轻松。你会感谢我的later@t-克劳森:我意识到我犯了一个错误。谢谢我已经相应地编辑了我的答案。@t-clausen.dk您现在看到这有什么问题吗?您正在强制使用“带领带”,您的脚本不容易阅读。您的性能不会达到最佳状态我有一个非常复杂的代码,其中这只是其中的一小部分。键列表是主表,其中至少有10个表使用左外部联接子查询联接。名称和金额是另一个表。即使在这种情况下,amt也不是一个直接的列。在这种情况下,如何合并此代码。它似乎非常有用。@Anon:你能详细说明一下“领带”是什么意思吗?如果你的数据也有102 Fred 150,你想要的输出是什么?肯定不会有相同amt的名称。我有一个非常复杂的代码,这只是其中的一小部分。键列表是主表,其中至少有10个表使用左外部联接子查询联接。名称和金额是另一个表。即使在这种情况下,amt也不是一个直接的列。在这种情况下,如何合并此代码。这似乎很有用。@Anon:你能详细说明一下“领带”是什么意思吗?如果你的数据也有102 Fred 150,你想要的输出是什么?肯定不会有相同金额的名称