Вы можете реализовать свои правила, используя агрегатные и оконные функции:
select acctid, date,
(case when count(*) = 1 then min(custid)
else min(backupid)
end) as imputed_customer
from (select acctid, date, min(backupid) as backupid, custid,
count(*) as cnt,
rank() over (partition by acctid, date order by count(*) desc) as seqnum
from t
group by acctid, date
) ad
where seqnum = 1
group by acctid, date;
Подзапрос агрегирует данные по acctid
, date
и custid
. Он также ранжирует custids для данной комбинации acct / date.
Затем внешний запрос говорит:
- Если есть только один максимум
custid
, используйте это. - В противном случае используйте
backupid
.
Обратите внимание, что если в данной комбинации acctid
/ date
есть несколько backupid
, то используется произвольная.