Объединить строки со значениями даты и удалить строки со всеми значениями NULL
У меня есть таблица 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 |...
Мне нужно объединить строки, содержащие данные Date, по '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-датами и много дополнительных столбцов с датами (каждый столбец в исходной таблице имеет уникальное имя. Спасибо, Уэйн
Шеф Одри! Похоже, я преждевременно проверил ваше решение. Когда я рассмотрел набор результатов более подробно, я обнаружил, что получаю несколько строк для каждого значения '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. Можете ли вы объяснить, как я мог бы объединить эти строки в одну строку для каждого идентификатора в первом столбце? Спасибо Уэйн
1 ответ
Чтобы отфильтровать строки без значений даты, вам нужно выражение 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
и агрегировать значения даты. Я полагаю, что ваши данные предполагают наличие только одного значения даты по идентификатору в одном столбце, поэтому вы можете использовать любую функцию агрегирования, но в случае нескольких значений даты определите, какую дату вы хотите получить. Я предполагаю, что вы хотите получить самую последнюю дату, поэтому я напишу запрос, используя функцию 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