【问题标题】:Return rows with column having min value返回具有最小值的列的行
【发布时间】:2014-06-18 04:00:49
【问题描述】:

我有一个场景

Key Name Amt
101 Nikh 100
101 Mark 150
101 Jess 75
102 Sam  200
102 Lee  150

请注意,多条记录的 Key 相同。它也来自与 Name 和 Amt 不同的表。我想返回最低 Amt 的记录。下面是例子:

Key  Name  Amt
101  Jess  75
102  Lee   150

到目前为止,我有一个代码正在运行,它返回 Key 和 Amt 记录,我如何添加一个 Name 列并确保它返回与 min(Amt) 关联的名称 请注意:我正在研究 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

【问题讨论】:

  • 类似于this recent question,不同之处在于您要查找的是 MIN 而不是 MAX。
  • 你的意思是表A、B、C、D、E是视图表,那么是
  • 为误解您的问题而道歉。不,这不是风景

标签: sql sql-server reporting-services ssrs-2008


【解决方案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

编辑:如果在平局的情况下,您想显示所有具有最低 Amt 的结果,请将 row_number() 替换为 rank()

【讨论】:

    【解决方案2】:

    您应该使用row_number()

    select [key], name, amt
    from (select t.*, row_number() over (partition by [key] order by amt asc) as seqnum
          from table t
         ) t
    where seqnum = 1;
    

    【讨论】:

    • 我有一个非常复杂的代码,这只是其中的一小部分。 Key 列表是主表,其中至少有 10 个表使用左外连接(子查询)连接。 Name 和 amt 是另一个表。即使在那个 amt 也不是一个直截了当的专栏。在这种情况下,我如何合并此代码。看起来很有用。
    • @Anon:你能详细说明一下'关系怎么样'是什么意思吗?
    • 如果你的数据也有102 Fred 150,你想要的输出是什么?
    • 肯定不会有同名的名字
    【解决方案3】:

    如果您只想要一个简单的查询,那么这里有一种方法:

    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
    

    你可以在这里看到这个-> http://sqlfiddle.com/#!3/b2628/39

    希望对你有帮助!!!

    【讨论】:

    • 我不认为这与 OP 想要的输出相似?
    • Jerry - 您应该阅读/了解排名函数。他们真的会让你的生活更轻松。以后你会感谢我的
    • @t-clausen.dk 我意识到我犯了一个错误。谢谢。我已经相应地编辑了我的答案。
    • @t-clausen.dk 你现在觉得这有什么问题吗?
    • 您正在强制使用“有关系”,您的脚本不易阅读。你的表现不会是最佳的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多