SQL – SELECT MAX()和附带字段

前端之家收集整理的这篇文章主要介绍了SQL – SELECT MAX()和附带字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我所拥有的基本上是一个容易用多个表解决的问题,但我只有一个表来完成它.

请考虑以下数据库

UserID UserName EmailAddress         Source
3K3S9  Ben      ben@myisp.com        user
SF13F  Harry    lharry_x@hotbail.com 3rd_party
SF13F  Harry    reside@domain.com    user
76DSA  Lisa     cake@insider.com     user
OL39F  Nick     stick@whatever.com   3rd_party
8F66S  Stan     myman@lol.com        user

我需要选择所有字段,但只需要每个用户一次以及其中一个电子邮件地址(由MAX()函数确定的“最大”字段).这是我追求的结果……

UserID UserName EmailAddress         Source
3K3S9  Ben      ben@myisp.com        user
SF13F  Harry    lharry_x@hotbail.com 3rd_party
76DSA  Lisa     cake@insider.com     user
OL39F  Nick     stick@whatever.com   3rd_party
8F66S  Stan     myman@lol.com        user

正如你所看到的,“Harry”只用他的“最高”电子邮件地址显示一次相应的“来源”

目前正在发生的事情是我们正在对UserID,UserName进行分组,并使用MAX()作为EmailAddress和Source,但这两个字段的最大值并不总是匹配,它们需要来自同一记录.

我已经通过加入表自己尝试了另一个进程,但我只是设法获得正确的电子邮件地址,但没有获得该地址的相应“源”.

任何帮助将不胜感激,因为我已经花了太长时间试图解决这个问题:)

解决方法

如果您使用的是sql Server 2005或更高版本,
SELECT  UserID,UserName,EmailAddress,Source
FROM    (SELECT UserID,Source,ROW_NUMBER() OVER (PARTITION BY UserID
                                   ORDER BY EmailAddress DESC) 
                    AS RowNumber
         FROM   MyTable) AS a
WHERE   a.RowNumber = 1

当然,有一些方法可以在没有(sql-Standard)排名函数的情况下执行相同的任务,例如ROW_NUMBER,sql Server自2005年以来仅实现了这一功能包括嵌套的依赖查询和带有ON的自左连接,包括’>’和一个WHERE … IS NULL技巧 – 但排名函数使得sql Server引擎可以读取并且(理论上)可以很好地优化代码.

编辑:this article是一个很好的排名教程,但它在示例中使用RANK而不是ROW_NUMBER(或其他排名函数,DENSE_RANK) – 当同一分区中的分组行之间存在“联系”时,区别很重要订购标准. this post很好地解释了差异.

原文链接:/mssql/84315.html

猜你在找的MsSQL相关文章