#sql #group-by #netezza
#sql #группировка по #netezza
Вопрос:
У меня есть необработанные данные, которые имеют несколько дат для каждой категории, и я использую код case when category = 'referral' then min(date) end as date_referral
для получения самых ранних дат каждой категории для каждого идентификатора.
Однако он не будет возвращать данные в строке, а создаст строку для каждой категории как таковую:
id date_entered date_referral date_reply date_final
-------------------------------------------------------------------------
1 2020-12-20 null null null
1 2020-12-20 2020-12-21 null null
1 2020-12-20 null 2020-12-21 null
1 2020-12-20 null null 2020-12-24
Я попытался применить отдельные строки с помощью distinct
или group by
(отдельно и вместе):
select distinct id
, date_entered
, case when category = 'referral' then min(date) end as date_referral
, case when category = 'reply' then min(date) end as date_reply
, case when category = 'final' then min(date) end as date_final
from data
group by id
, date_entered
, category
но он будет продолжать возвращать несколько строк, причем каждая строка вычисляется по самой ранней дате для каждой категории. Я также попытался создать cte после этого кода select distinct id, date_entered, date_referral, date_reply, date_final from table
, но он также по-прежнему возвращает несколько строк..
Как я могу объединить эти строки и заставить их возвращать одну строку?
Ответ №1:
Вы не должны группировать по category
.
Используйте условную агрегацию следующим образом:
select id, date_entered,
min(case when category = 'referral' then date end) as date_referral,
min(case when category = 'reply' then date end) as date_reply,
min(case when category = 'final' then date end) as date_final
from data
group by id, date_entered