Объединить строки со значениями даты и удалить строки со всеми значениями NULL - PullRequest
0 голосов
/ 18 января 2019

У меня есть таблица 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-датами и много дополнительных столбцов дат (каждый столбец в исходной таблице имеет уникальное имя. Спасибо, Wayne

Опс Одри! Похоже, я преждевременно проверил ваше решение. Когда я рассмотрел набор результатов более подробно, я обнаружил, что получаю несколько строк для каждого значения '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 Ответ

0 голосов
/ 18 января 2019

Чтобы отфильтровать строки без значений даты, вам нужно выражение 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
...