Необходимо преобразовать данные в несколько строк с одинаковым идентификатором в 1 строку с несколькими столбцами
Я рассмотрел версии своего вопроса, к которым уже обращался, но некоторые полезные советы, которые я нашел (например, используя rank() над (разделом...)), не работают в той версии Sybase, на которой я сейчас.
Я надеюсь запустить процедуру, которая извлекает данные, организованные следующим образом:
Email | предпочтение
email1 | PreferenceXYZ
email1 | PreferenceABC
И сделать это в виде таблицы следующим образом:
Email | Preference1 | Preference2
email1 | PreferenceXYZ | PreferenceABC
По сути, у меня есть несколько записей для одного и того же человека (лучше всего идентифицируемых по записи электронной почты в качестве уникального идентификатора), и я хочу зафиксировать эти несколько предпочтений для данного пользователя и создать 1 индивидуальную запись для каждого пользователя (для каждого электронного письма).
1 ответ
Если у вас есть только два предпочтения, то вы можете использовать min()
а также max()
:
select email, min(preference) as preference1,
(case when min(preference) <> max(preference) then max(preference) end) as preference2
from t
group by email;
РЕДАКТИРОВАТЬ:
Если у вас есть до семи значений, то используйте row_number()
:
select email,
max(case when seqnum = 1 then preference end) as preference1,
max(case when seqnum = 2 then preference end) as preference2,
max(case when seqnum = 3 then preference end) as preference3,
max(case when seqnum = 4 then preference end) as preference4,
max(case when seqnum = 5 then preference end) as preference5,
max(case when seqnum = 6 then preference end) as preference6,
max(case when seqnum = 7 then preference end) as preference7
from (select t.*, row_number() over (partition by email order by preference) as seqnum
from t
) t
group by email;
РЕДАКТИРОВАТЬ II:
Вы можете сделать это с помощью коррелированного подзапроса вместо row_number()
:
select email,
max(case when seqnum = 1 then preference end) as preference1,
max(case when seqnum = 2 then preference end) as preference2,
max(case when seqnum = 3 then preference end) as preference3,
max(case when seqnum = 4 then preference end) as preference4,
max(case when seqnum = 5 then preference end) as preference5,
max(case when seqnum = 6 then preference end) as preference6,
max(case when seqnum = 7 then preference end) as preference7
from (select t.*,
(select count(*)
from t t2
where t2.email = t.email and
t2.preference <= t.preference
) as seqnum
from t
) t
group by email;