Динамическая сводная таблица для каждой строки (MySql) - PullRequest
0 голосов
/ 29 августа 2018

У меня есть таблица Клиенты любят:

ID       Type       Date          Address         SSN
RT124    MASTER     12/15/2005    7 Hill st       12345 
RT542    MASTER     06/14/2006    7 Hill st       12345
HT457    UNIQUE     10/27/2009    10 PARK WAY     24569   
QA987    UNIQUE     08/28/2010    10 PARK WAY     24569
AH825    UNIQUE     10/12/2012    10 PARK WAY     24569
14837    SINGLE     05/05/2010    2 TED ROAD      11111
24579    MARRIED    06/24/2014    2 TED ROAD      11111

Я хочу создать новый столбец + # для каждого дублированного адреса и SSN, и всегда ID # 1 должен быть самой последней датой.

Примечание: эта таблица содержит только повторяющиеся строки, основанные на адресе и SSN, но уникальный идентификатор и не требует никакой суммы.

Таким образом, вывод должен быть таким (нажмите на картинку для увеличения): enter image description here

Я провел некоторое исследование и попробовал несколько примеров, но ничего не получилось, чтобы получить этот вывод.

Буду признателен за любую помощь!

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Существует ли ограничение на количество копий адреса? Если есть известный предел, вы можете иметь количество левых соединений для каждого дубликата. Следующее было бы решением, если бы вы знали, что будет только 6 или меньше дубликатов:

with a as (
select 
    ID
    ,type
    ,date
    ,address
    ,SSN
    row_number() over(partition by address, SSN order by date desc) as R
from Customers
)

select 
    a.id ID1
    ,a.type TYPE1
    ,a.date DATE1
    ,a.address ADDRESS1
    ,a.ssn SSN1

    ,b.id ID2
    ,b.type TYPE2
    ,b.date DATE2
    ,b.address ADDRESS2
    ,b.ssn SSN2

    ,c.id ID3
    ,c.type TYPE3
    ,c.date DATE3
    ,c.address ADDRESS3
    ,c.ssn SSN3

    ,d.id ID4
    ,d.type TYPE4
    ,d.date DATE4
    ,d.address ADDRESS4
    ,d.ssn SSN4

    ,e.id ID5
    ,e.type TYPE5
    ,e.date DATE5
    ,e.address ADDRESS5
    ,e.ssn SSN5

    ,f.id ID6
    ,f.type TYPE6
    ,f.date DATE6
    ,f.address ADDRESS6
    ,f.ssn SSN6

from a
left join
    (select * from a
    where r=2
    ) b
on a.address=b.address and a.ssn=b.ssn

left join
    (select * from a
    where r=3
    ) c
on a.address=c.address and a.ssn=c.ssn

left join
    (select * from a
    where r=4
    ) d
on a.address=d.address and a.ssn=d.ssn

left join
    (select * from a
    where r=5
    ) e
on a.address=e.address and a.ssn=e.ssn

left join
    (select * from a
    where r=6
    ) f
on a.address=f.address and a.ssn=f.ssn

where r=1

Если у вас более 6, просто добавьте еще один набор столбцов в оператор выбора:

    ,f.id ID6
    ,f.type TYPE6
    ,f.date DATE6
    ,f.address ADDRESS6
    ,f.ssn SSN6

и новое левое присоединение к оператору from:

left join
    (select * from a
    where r=6
    ) f
on a.address=f.address and a.ssn=f.ssn
0 голосов
/ 29 августа 2018

Вам нужно перечислить строки и агрегировать. В MySQL (до V8) это выглядит так:

select address, ssn,
       max(case when rn = 1 then id end) as id1,
       max(case when rn = 1 then type end) as type1,
       max(case when rn = 1 then date end) as date1,
       max(case when rn = 2 then id end) as id2,
       max(case when rn = 2 then type end) as type2,
       max(case when rn = 2 then date end) as date2
       . . .
from (select c.*,
             (@rn := if(@as = concat_ws(':', address, ssn), @rn + 1,
                        if(@as := concat_ws(':', address, ssn), 1, 1)
                       )
             ) as rn
      from (select c.* from customers c order by address, ssn, date desc) c cross join
           (select @as := '', @rn := 0) params
     ) c
group by address, ssn;

Обратите внимание, что это не повторяет address и ssn. Это не кажется полезным, но вы, конечно, можете повторить эти столбцы в каждой группе.

...