Объединение нескольких строк в одну строку путем группировки и проверки ненулевых - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть данные в этом формате. Я хочу объединить несколько строк в одну строку группировки по столбцу ID. каждая строка будет иметь только одно ненулевое значение и одно ненулевое значение для каждого столбца при группировании по ID.

   [ID], [foo], [foo1], [foo2], [foo3], [foo4], [foo5]
    1,    data1,  null,    null,  null,    null,  null
    1,    null,   data2,    null,  null,    null,  null
    1,    null,  null,    data3,  null,    null,  null
    1,    null,  null,    null,  data4,    null,  null
    1,    null,  null,    null,  null,    data5,  null
    1,    null,  null,    null,  null,    null,  data6
    2,    data1,  null,    null,  null,    null,  null
    2,    null,  data2,    null,  null,    null,  null
    2,    null,  null,    data3,  null,    null,  null
    2,    null,  null,    null,  data4,    null,  null
    2,    null,  null,    null,  null,    data5,  null
    2,    null,  null,    null,  null,    null,  data6

Desired Output:
   [ID], [foo], [foo1], [foo2], [foo3], [foo4], [foo5]
   1,    data1,  data2,  data3, data4,   data5,  data6
   2,    data1,  data2,  data3, data4,  data5,  data6

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Агрегатные функции max и min (как и большинство других) просто игнорируют null с. Вы можете сгруппировать по идентификатору и запросить максимальное количество других столбцов, что вернет единственное не-null значение, которое имеет этот столбец:

SELECT   id, MAX(foo), MAX(foo1), MAX(foo2), MAX(foo3), MAX(foo4), MAX(foo5)
FROM     mytable
GROUP BY id
0 голосов
/ 12 сентября 2018

В вашем случае вы можете использовать max():

select id, max(foo) as foo, max(foo1) as foo1, . . . 
from t
group by id;

Я должен отметить, что ваша исходная структура данных часто создается с помощью немного ошибочного запроса.Иногда проще исправить код, который генерирует этот результат.

...