合并具有日期值的行,并删除具有所有NULL日期的行

时间:2019-01-18 00:38:15

标签: merge sql-server-2017

我有一个Microsoft SQL Server 2017表,其结构类似于此:

id | i_id | item_name    | date1      | date2      | date3     | date4     | date5     |...
---+------+--------------+------------+------------+-----------+-----------+-----------+---
 1 | 1234 | item_a       | 01/01/2019 |NULL        |01/03/2019 |NULL       |...
 1 | 1234 | item_a       | NULL       |NULL        |NULL       |01/05/2019 |NULL       |...
 1 | 1235 | item_b       | NULL       |NULL        |NULL       |NULL       |NULL       |...
 1 | 1235 | item_b       | NULL       |NULL        |NULL       |NULL       |NULL       |...
 1 | 1235 | item_b       | NULL       |NULL        |NULL       |NULL       |01/07/2019 |...
 2 | 1236 | item_c       | NULL       |NULL        |NULL       |NULL       |NULL       |...
 2 | 1236 | item_c       | NULL       |NULL        |NULL       |NULL       |NULL       |...
 2 | 1236 | item_c       | NULL       |NULL        |01/12/2019 |NULL       |NULL       |...
 2 | 1237 | item_d       | NULL       |NULL        |NULL       |NULL       |01/15/2019 |...
 2 | 1237 | item_d       | NULL       |NULL        |NULL       |NULL       |NULL       |...
 3 | 1238 | item_e       | 01/18/2019 |NULL        |NULL       |NULL       |NULL       |...
 3 | 1238 | item_e       | NULL       |NULL        |NULL       |NULL       |NULL       |...
 3 | 1239 | item_f       | NULL       |NULL        |NULL       |NULL       |NULL       |...
 3 | 1239 | item_f       | NULL       |NULL        |NULL       |01/20/2019 |NULL       |...

我需要通过“ id”合并包含日期数据的行,并删除不包含任何日期的那些行,类似于:

id | date1      | date2     | date3     | date4     | date5     |...
---+------------+-----------+-----------+-----------+-----------+---
 1 | 01/01/2019 |NULL       |01/03/2019 |01/05/2019 |01/07/2019 |...
 2 | NULL       |NULL       |01/12/2019 |NULL       |01/15/2019 |...
 3 | 01/18/2019 |NULL       |NULL       |01/20/2019 |NULL       |...

有人可以帮助我合并这样的数据结构吗?可能有许多带有空日期的“ id”记录和许多其他的日期列(源表中的每个列都唯一命名)。 谢谢, 韦恩

奥黛丽!看来我对您的解决方案进行测试还为时过早。当我更详细地查看结果集时,我发现每个'id'值都获得了多行,类似于下面的示例:

id | i_id | date1      | date2      | date3      | date4      | date5      |...
---+------+------------+------------+------------+------------+------------+---
 1 | 1234 | 01/01/2019 | NULL       | 01/03/2019 | 01/05/2019 | NULL       |...
 1 | 1235 | NULL       | NULL       | NULL       | NULL       | 01/07/2019 |...
 2 | 1236 | NULL       | NULL       | 01/12/2019 | NULL       | NULL       |...
 2 | 1237 | NULL       | NULL       | NULL       | NULL       | 01/15/2019 |...
 3 | 1238 | 01/18/2019 | NULL       | NULL       | NULL       | NULL       |...
 3 | 1239 | NULL       | NULL       | NULL       | 01/20/2019 | NULL       |...

我仍然是使用SQL查询的新手。您能否解释一下我如何将第一列中的每个“ id”合并为一行? 谢谢,韦恩

1 个答案:

答案 0 :(得分:0)

要过滤掉没有日期值的行,您需要像这样的where子句:

where date1 is not null or date2 is not null or date3 is not null -- All date columns

如果您使用Text Manifest书写,则可以将其缩短一点:

where COALESCE(date1, date2, date3, date4, date5) is not null

然后,您需要按ID将其余行分组,并汇总日期值。我相信您的数据假设在一列中按ID仅包含1个日期值,因此您可以使用任何聚合函数,但是如果有多个日期值,请定义要获取的日期。我假设您想获取最新日期,所以我将使用COALESCE函数编写查询。

因此最终查询可能如下所示:

select
    ID
    , MAX(date1) as date1
    , MAX(date2) as date2
    , MAX(date3) as date3
    , MAX(date4) as date4
    , MAX(date5) as date5
    -- Rest of the dates columns aggregated the same way
from MyTable
where COALESCE(date1, date2, date3, date4, date5 /* Rest of the date columns */) is not null
group by ID