Самая популярная категория в каждой строке базы данных красного смещения - PullRequest
0 голосов
/ 31 января 2020

Мне требуются следующие данные: например, шведская мужская маркаA EUR шведская женская маркаA EUR шведская мужская маркаB EUR английская мужская маркаA EUR английская женская маркаA EUR английская мужская маркаB EUR женская женская марка C EUR

EUR поступила из тот факт, что из 8000 человек 5000 используют евро, 2000 используют gbp и 1000 используют SEk. Так что самая популярная валюта - евро. Я хотел бы, чтобы он отображался для каждой строки

, чтобы получить наиболее популярную валюту max_curr

, и для каждой возвращаемой строки иметь столбец max_curr с этим значением, отображаемым

    select 
cdl.country
,cd.gender
,cd.brand
,t.max_curr
from customer_data_list cdl  
left join customer_data cd on cd.customerid = cdr.customerid
left join 
(
    select 
        trans.customerid, a.*
    from
    (
        select
            a.*
            ,max(count_currency) over() as max_curr
        FROM
        (
            select 
                t.currency
                ,count(t.currency) as count_currency
            from transactions t
            where t.function = 'DEPOSIT' and t.status = 'ACCEPTED' 
            group by t.currency
            order by currency
        ) a
    ) a
    left join transactions trans on trans.currency = a.currency 
    where count_currency = max_curr) t on t.customerid = cdl.customerid 

Это не возвращает то, что мне нужно, потому что большинство записей столбца max_curr пустые. Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 31 января 2020

Если для каждого клиента требуется валюта, которая чаще всего используется для транзакций ACCEPTED, DEPOSIT, вы можете использовать функции агрегирования и окна:

select cc.*
from (select t.customerid, t.currency, count(*) as cnt,
             row_number() over (partition by t.customerid order by count(*) desc) as seqnum
      from transactions t
      where t.function = 'DEPOSIT' and
            t.status = 'ACCEPTED' 
      group by t.customerid, t.currency
     ) cc
where seqnum = 1;

EDIT:

Для исправленной интерпретации вопроса просто используйте перекрестное соединение:

select t.customerid, t.currency, count(*) as cnt,
       tt.currency as most_popular_currency
from transactions t cross join
     (select t.currency
      from transactions t
      where t.function = 'DEPOSIT' and
            t.status = 'ACCEPTED'
      group by t.currency
      order by count(*) desc
      limit 1
     ) tt
where t.function = 'DEPOSIT' and
      t.status = 'ACCEPTED' 
group by t.customerid, t.currency
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...