May*_*May 1 sql t-sql sql-server greatest-n-per-group
我是SQL的新手,我一直绞尽脑汁想要确切地知道我在工作中收到的查询到底是什么.我相信它正在使用别名,但我不确定为什么,因为它只有一个表所指的.我认为这是一个相当简单的我只是没有得到它.
select [CUSTOMERS].Prefix,
[CUSTOMERS].NAME,
[CUSTOMERS].Address,
[CUSTOMERS].[START_DATE],
[CUSTOMERS].[END_DATE] from [my_Company].[CUSTOMERS]
where [CUSTOMERS].[START_DATE] =
(select max(a.[START_DATE])
from [my_company].[CUSTOMERS] a
where a.Prefix = [CUSTOMERS].Prefix
and a.Address = [CUSTOMERS].ADDRESS
and coalesce(a.Name, 'Go-Figure') =
coalesce([CUSTOMERS].a.Name, 'Go-Figure'))
Run Code Online (Sandbox Code Playgroud)
这是英文版的一个镜头......
看起来目的是获取客户名称,地址,开始日期的列表.
但是该表预计包含多个具有相同客户名称和地址的行,并且作者只希望具有最新开始日期的行.
好点:
如果缺少客户,则使用名称"Go Figure".因此,缺少名称的两行将匹配,并且将返回具有最近开始日期的行.缺少名称的行与具有名称的另一行不匹配.这两行都将被返回.
任何没有开始日期的行都将从结果中排除.
这看起来不像来自真实业务应用程序的查询.也许它只是一个概念原型.在大多数现实世界中,它充满了问题.匹配名称和地址与简单的相等只是在现实世界中不能很好地工作,除非名称和地址已被其他进程清理和重复删除.
关于别名的使用:是的.子查询使用a作为my_Company.CUSTOMERS表的别名.
我相信最后一行有错误.
[CUSTOMERS].a.Name
Run Code Online (Sandbox Code Playgroud)
不是有效的参考.它可能意味着
[CUSTOMERS].Name
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |