我所拥有的基本上是一个容易用多个表解决的问题,但我只有一个表来完成它.
请考虑以下数据库表
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
Run Code Online (Sandbox Code Playgroud)
我需要选择所有字段,但只需要每个用户一次以及其中一个电子邮件地址(由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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,"Harry"只用他的"最高"电子邮件地址显示一次相应的"来源"
目前正在发生的事情是我们正在对UserID,UserName进行分组,并使用MAX()作为EmailAddress和Source,但这两个字段的最大值并不总是匹配,它们需要来自同一记录.
我已经通过加入表自己尝试了另一个进程,但我只是设法获得正确的电子邮件地址,但没有获得该地址的相应"源".
任何帮助将不胜感激,因为我花了太长时间试图解决这个问题:)
如果您使用的是SQL Server 2005或更高版本,
SELECT UserID, UserName, EmailAddress, Source
FROM (SELECT UserID, UserName, EmailAddress, Source,
ROW_NUMBER() OVER (PARTITION BY UserID
ORDER BY EmailAddress DESC)
AS RowNumber
FROM MyTable) AS a
WHERE a.RowNumber = 1
Run Code Online (Sandbox Code Playgroud)
当然,有一些方法可以在没有(SQL-Standard)排名功能的情况下执行相同的任务,例如ROW_NUMBER,自2005年以来SQL Server仅实现了这些功能- 包括嵌套的依赖查询和自我左连接,ON包括'>'和WHERE ... IS NULL技巧 - - 但是排名函数使得SQL Server引擎可以读取并且(在理论上)可以很好地优化代码.
编辑:这篇文章是关于排名的一个很好的教程,但它RANK在示例中使用而不是ROW_NUMBER(或其他排名函数DENSE_RANK) - 根据排序标准,当同一分区中的分组行之间存在"联系"时,区别很重要.这篇文章很好地解释了差异.
select distinct * from table t1
where EmailAddress =
(select max(EmailAddress) from table t2
where t1.userId = t2.userId)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9222 次 |
| 最近记录: |