如何在每列中选择下一个非空值。T-SQL

达米安·巴克(Damien Barker)

我试图根据日期值选择每列的最后一个非空值。

我有一张看起来像这样的桌子-

Email           Name1   Name2   Job     Date
[email protected]  Ron     NULL    NULL    2015-01-01 00:00:00.000
[email protected]  Dave    Smith   NULL    2014-01-01 00:00:00.000
[email protected]  NULL    NULL    NULL    2013-01-01 00:00:00.000
[email protected]  NULL    Smith   NULL    2014-01-01 00:00:00.000
[email protected]  NULL    Ford    Plumber 2015-01-01 00:00:00.000`

我想为每个电子邮件地址的每一列显示最新的非空值。

输出应为-

Email           Name1   Name2   Job
[email protected]  Ron     Smith   NULL
[email protected]  NULL    Ford    Plumber

我已经写了一些难看的SQL来解决此问题,但是我想将此逻辑应用于具有更多列的另一个表。

我的问题是-是否有一种更简单的方法而不必为每个列联接?

目前的解决方案如下-

select distinct  a.[Email],b.[Name1],c.[Name2],d.[job] from 
(
select [Email] from #test
)
A
left join 
(
SELECT [Email],
 FIRST_VALUE([Name1]) over(partition by [Email] order by [Date] desc) as [Name1]
from #test
where [Name1] is not null
) b
on a.[Email] = b.[Email]
left join 
(
SELECT [Email],
FIRST_VALUE([Name2]) over(partition by [Email] order by [Date] desc) as [Name2]
from  #test
where [Name2] is not null
) c
on a.[Email] = c.[Email]
left join 
(
select [Email],
FIRST_VALUE([Job]) over(partition by [Email] order by [Date] desc) as [Job]
from #test
where  [Job] is not null
) d
on a.[Email] = d.[Email]

如果有帮助,这是示例表的DDL / DML-

create table #test
([Email] nvarchar(50),
[Name1]  nvarchar(50),
[Name2] nvarchar(50),
[Job] nvarchar(50),
[Date] datetime)

insert into #test
values
('[email protected]', 'Ron', null,null,'20150101'),
('[email protected]', 'Dave' ,'Smith',null, '20140101'),
('[email protected]', null, null, null ,'20130101'),
('[email protected]', null, 'Smith', null, '20140101'),
('[email protected]', null, 'Ford', 'Plumber','20150101')
戈登·利诺夫(Gordon Linoff)

有些方法不需要那么多的联接。没有一个很简单,因为SQL Server不支持ignore nullson上选项lag()

基本上,您需要在每一列上进行逻辑运算。没有子查询的一种方法是:

select distinct email,
       first_value(name1) over (partition by email
                                order by (case when name1 is not null then date else '2000-01-01' end) desc
                               ) as name1,
       . . .
from #test;

一种替代方法是使用外部应用:

select t.email, name1, . . .
from (select distinct email from #test t) t outer apply
     (select top 1 name1
      from #test t2
      where t2.email = t.email and name1 is not null
      order by date desc
     ) name1 . . .

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL获取列中的下一个非空值

来自分类Dev

考虑到SQL中的另一列,如何选择列中的下一个可用值?

来自分类Dev

SQL:从表中选择一行,并在其中包含包含该列的下一个值的其他列

来自分类Dev

SQL:从表中选择一行,并在其中包含包含该列的下一个值的其他列

来自分类Dev

SQL查询,如何选择下一个值为当前值+1的间隔,标识下一个间隔并保持其他所有不变?

来自分类Dev

如何在实体框架中获取SQL Server序列的下一个值?

来自分类Dev

如何在sql中选择第一个非重复数据

来自分类Dev

选择要在当前日期计算的下一个日期的值SQL

来自分类Dev

如何在SQL Server存储过程中选择第一个ID的值?

来自分类Dev

SQL:如何从一个表中选择多个值作为单独的列

来自分类Dev

从序列SQL获取下一个值

来自分类Dev

动态SQL:序列的下一个值失败

来自分类Dev

在列中的日期值之后查找下一个日期(SQL Server 2008)

来自分类Dev

如何从SQL Server获取下一个标识值

来自分类Dev

如何获取和锁定下一个标识值SQL Server

来自分类Dev

如何从内部联接SQL获取下一个值

来自分类Dev

PHP SQL 表单 - 如何将值传递给下一个 Select

来自分类Dev

从20多个SQL列中选择3个非空值

来自分类Dev

Access/SQL:如何在 Access 查询中获取下一个最近的日期?

来自分类Dev

如何在 SQL Server 中添加上一个字段和下一个?

来自分类Dev

如何在SQL中的另一个表中选择与另一个值相对应的每个值

来自分类Dev

如何在SQL Server的表的所有列中选择具有空值的行?

来自分类Dev

在使用SQL的Access中选择一个特定的值

来自分类Dev

在sql的xml列中选择第一个<field>的值

来自分类Dev

如何在excel列中获取下一个非空单元格的值

来自分类Dev

SQL Server - 如何从不同的行但在同一个表中选择值

来自分类Dev

如何在SQl服务器中显示父下一个子行

来自分类Dev

如何在SQL Server 2008中的下一个星期三1700查找目标数据

来自分类Dev

SQL查询以基于另一个表中的列值从一个表中选择

Related 相关文章

  1. 1

    SQL获取列中的下一个非空值

  2. 2

    考虑到SQL中的另一列,如何选择列中的下一个可用值?

  3. 3

    SQL:从表中选择一行,并在其中包含包含该列的下一个值的其他列

  4. 4

    SQL:从表中选择一行,并在其中包含包含该列的下一个值的其他列

  5. 5

    SQL查询,如何选择下一个值为当前值+1的间隔,标识下一个间隔并保持其他所有不变?

  6. 6

    如何在实体框架中获取SQL Server序列的下一个值?

  7. 7

    如何在sql中选择第一个非重复数据

  8. 8

    选择要在当前日期计算的下一个日期的值SQL

  9. 9

    如何在SQL Server存储过程中选择第一个ID的值?

  10. 10

    SQL:如何从一个表中选择多个值作为单独的列

  11. 11

    从序列SQL获取下一个值

  12. 12

    动态SQL:序列的下一个值失败

  13. 13

    在列中的日期值之后查找下一个日期(SQL Server 2008)

  14. 14

    如何从SQL Server获取下一个标识值

  15. 15

    如何获取和锁定下一个标识值SQL Server

  16. 16

    如何从内部联接SQL获取下一个值

  17. 17

    PHP SQL 表单 - 如何将值传递给下一个 Select

  18. 18

    从20多个SQL列中选择3个非空值

  19. 19

    Access/SQL:如何在 Access 查询中获取下一个最近的日期?

  20. 20

    如何在 SQL Server 中添加上一个字段和下一个?

  21. 21

    如何在SQL中的另一个表中选择与另一个值相对应的每个值

  22. 22

    如何在SQL Server的表的所有列中选择具有空值的行?

  23. 23

    在使用SQL的Access中选择一个特定的值

  24. 24

    在sql的xml列中选择第一个<field>的值

  25. 25

    如何在excel列中获取下一个非空单元格的值

  26. 26

    SQL Server - 如何从不同的行但在同一个表中选择值

  27. 27

    如何在SQl服务器中显示父下一个子行

  28. 28

    如何在SQL Server 2008中的下一个星期三1700查找目标数据

  29. 29

    SQL查询以基于另一个表中的列值从一个表中选择

热门标签

归档