Объединение нескольких источников данных в единую таблицу - PullRequest
1 голос
/ 01 октября 2009

Моя компания работает с 3 партнерами, и у каждого партнера может быть несколько брендов. Каждую неделю я получаю дамп списка пользователей каждого бренда который я храню в базе данных MySQL с таблицей для каждого бренда. Каждый бренд содержит список пользователей и некоторую базовую информацию (год рождения, почтовый индекс, пол). Некоторые пользователи могут быть зарегистрированы в разных брендах, и у каждого бренда может быть свой набор данных о пользователе.

Например, пользователь подписан на Canvas и MNM. На Canvas их профиль выглядит так:

ID                                  GENDER  BIRTHYEAR   POSTCODE    MODIFIED
94bafdb3e155d30349f1113a25c0714f    M       1973        2800        2009-01-01 09:01:01

и в МНМ, вот так:

ID                                  GENDER  BIRTHYEAR   POSTCODE    MODIFIED
94bafdb3e155d30349f1113a25c0714f            1973        1000        2009-09-09 09:01:01

Я хотел бы создать представление (или таблицу - я не уверен, что лучше), которое бы объединяло две записи с использованием самой последней версии данных, но также сообщало мне, откуда поступили данные.

Таким образом, две вышеупомянутые записи объединятся в:

ID                                  GENDER  G_DATE              G_BRAND BIRTHYEAR   B_DATE              B_BRAND POSTCODE   P_DATE               P_BRAND
94bafdb3e155d30349f1113a25c0714f    M       2009-01-01 09:01:01 Canvas  1973        2009-09-09 09:01:01 MNM     1000       2009-09-09 09:01:01  MNM

Я представляю себе запутанную серию союзов и подзапросов, но я даже не совсем уверен, с чего начать.

Я создал представление, объединяющее все таблицы

CREATE VIEW view_combine AS
SELECT ID, GENDER, MODIFIED as G_DATE, 'Canvas' as G_BRAND, 
    BIRTHYEAR, MODIFIED as B_DATE, 'Canvas' as B_BRAND, 
    POSTCODE, MODIFIED as P_DATE, 'Canvas' as P_BRAND FROM canvas
UNION ALL
SELECT ID, GENDER, MODIFIED as G_DATE, 'Een' as G_BRAND, 
    BIRTHYEAR, MODIFIED as B_DATE, 'Een' as B_BRAND, 
    POSTCODE, MODIFIED as P_DATE, 'Een' as P_BRAND FROM een
UNION ALL
SELECT ID, GENDER, MODIFIED as G_DATE, 'MNM' as G_BRAND, 
    BIRTHYEAR, MODIFIED as B_DATE, 'MNM' as B_BRAND, 
    POSTCODE, MODIFIED as P_DATE, 'MNM' as P_BRAND FROM mnm

и затем я пытаюсь сделать выбор, но не думаю, что это верное направление.

SELECT v1.hashkey, ge.gender, ge.g_date, ge.g_brand, 
    bi.birthyear, bi.b_date, bi.b_brand, 
    pc.postcode, pc.p_date, pc.p_brand
FROM view1 v1
JOIN ( 
    select g.hashkey, g.gender, g.g_date, g.g_brand 
    from view1 g 
    left join view1 g1 ON g.hashkey = g1.hashkey AND g.g_date < g1.g_date 
    WHERE g1.hashkey IS NULL
) ge ON ge.HASHKEY = v1.HASHKEY
JOIN ( 
    select b.hashkey, b.birthyear, b.b_date, b.b_brand 
    from view1 b 
    left join view1 b1 ON b.hashkey = b1.hashkey AND b.b_date < b1.b_date 
    WHERE b1.hashkey IS NULL
) bi ON bi.HASHKEY = v1.HASHKEY
JOIN ( 
    select p.hashkey, p.postcode, p.p_date, p.p_brand 
    from view1 p 
    left join view1 p1 ON p.hashkey = p1.hashkey AND p.p_date < p1.p_date 
    WHERE p1.hashkey IS NULL
) pc ON pc.HASHKEY = v1.HASHKEY
GROUP BY v1.hashkey

Ответы [ 2 ]

1 голос
/ 01 октября 2009

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

С учетом данных:
Партнер 1 - Пользователь А, Мужской, Нулевой, 6300, 9/9/09
Партнер 2 - UserA, Null, 1980, 2300, 9/10/09

При запросе пользователя A вам, скорее всего, понадобится «Самая текущая запись»:
UserA, мужчина, 1980, 2300

Используя следующие таблицы:

Partner

TypeCode
DisplayName

CurrentUser

UserId
Пол
GenderSourcePartner
* 1022 год рождения * BirthYearSourcePartner
PostalCode
PostalCodeSourcePartner

PartnerSourceData

PartnerTypeCode
UserId
Пол
* 1032 год рождения * PostalCode
ModifiedDate

Затем, когда я получу исходные файлы партнера, я построчно обработаю его, чтобы обновить текущую пользовательскую таблицу и добавить в таблицу PartnerSourceData (используя ее в качестве журнала.)

1 голос
/ 01 октября 2009

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

SELECT v1.hashkey, ge.gender, ge.g_date, ge.g_brand, 
    bi.birthyear, bi.b_date, bi.b_brand, 
    pc.postcode, pc.p_date, pc.p_brand
FROM view_combine v1
JOIN ( 
    select g.hashkey, g.gender, g.g_date, g.g_brand 
    from view_combine g 
    left join view_combine g1 ON g.hashkey = g1.hashkey AND g.g_date < g1.g_date and g1.gender is not null
    WHERE g1.hashkey IS NULL
    order by g.g_date
) ge ON ge.HASHKEY = v1.HASHKEY
JOIN ( 
    select b.hashkey, b.birthyear, b.b_date, b.b_brand 
    from view_combine b 
    left join view_combine b1 ON b.hashkey = b1.hashkey AND b.b_date < b1.b_date and b1.birthyear is not null
    WHERE b1.hashkey IS NULL
    order by b.b_date
) bi ON bi.HASHKEY = v1.HASHKEY
JOIN ( 
    select p.hashkey, p.postcode, p.p_date, p.p_brand 
    from view_combine p 
    left join view_combine p1 ON p.hashkey = p1.hashkey AND p.p_date < p1.p_date and p1.postcode is not null
    WHERE p1.hashkey IS NULL
    order by p.p_date
) pc ON pc.HASHKEY = v1.HASHKEY
GROUP BY v1.hashkey
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...