合并具有日期值的行并删除具有所有 NULL 日期的行
Merge Rows with Date Values and remove rows with all NULL Dates
我有一个 Microsoft SQL Server 2017 Table,其结构类似于:
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' 记录具有 NULL 日期和许多其他日期列(源 Table 中的每一列都是唯一命名的。
谢谢,
韦恩
行动奥黛丽!看来我对您的解决方案进行测试还为时过早。当我更详细地查看结果集时,我发现我为每个 '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' 的这些行合并为一行吗?
谢谢,韦恩
要过滤掉没有日期值的行,您需要这样的 where 子句:
where date1 is not null or date2 is not null or date3 is not null -- All date columns
如果你写的是使用 COALESCE:
,你可以缩短一点
where COALESCE(date1, date2, date3, date4, date5) is not null
然后您需要按 ID
对其余行进行分组并聚合日期值。我相信您的数据假设在一列中按 ID 只有 1 个日期值,因此您可以使用任何聚合函数,但如果有多个日期值,请定义您想要获取的日期。我假设您想获取最新日期,因此我将使用 MAX 函数编写查询。
因此最终查询可能如下所示:
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
我有一个 Microsoft SQL Server 2017 Table,其结构类似于:
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' 记录具有 NULL 日期和许多其他日期列(源 Table 中的每一列都是唯一命名的。 谢谢, 韦恩
行动奥黛丽!看来我对您的解决方案进行测试还为时过早。当我更详细地查看结果集时,我发现我为每个 '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' 的这些行合并为一行吗? 谢谢,韦恩
要过滤掉没有日期值的行,您需要这样的 where 子句:
where date1 is not null or date2 is not null or date3 is not null -- All date columns
如果你写的是使用 COALESCE:
,你可以缩短一点where COALESCE(date1, date2, date3, date4, date5) is not null
然后您需要按 ID
对其余行进行分组并聚合日期值。我相信您的数据假设在一列中按 ID 只有 1 个日期值,因此您可以使用任何聚合函数,但如果有多个日期值,请定义您想要获取的日期。我假设您想获取最新日期,因此我将使用 MAX 函数编写查询。
因此最终查询可能如下所示:
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