MySQL заявка: сумирайте стойностите на колоната с различни за друга колона

Опитвам се да създам MySQL заявка с множество съединявания със сбор от обединени стойности. Има 3 таблици: клиент, сметка и депозит. Сметката и депозитът се присъединяват към клиента чрез тяхното поле customer_id. В края на заявката всички клиенти се групират по техния group_id:

SELECT customer.*,
COUNT(DISTINCT account.id) as account_count,
SUM(deposit.amount)/(COUNT(deposit.id)/COUNT(DISTINCT deposit.id)) as deposit_sum,
SUM(???) as deposit_first_sum
FROM customer
    LEFT JOIN account ON account.customer_id = customer.id 
    LEFT JOIN deposit ON deposit.customer_id = customer.id 
GROUP BY customer.group_id

Проблемът е: съединените редове се дублират, докато трябва да направя някои анализи: сумирам цялата сума на депозита - може да видите моето решение тук за deposit_sum. Но истинският проблем е да се сумират "първите депозити, направени от клиенти". Преди да групираме резултатите, може да видим, че има нещо като:

... deposit.id deposit.customer_id  deposit.amount
...     1               1               10
...     2               1               20
...     3               2               15
...     4               2               30

Така че това, от което се нуждая, е да сумирам само първата сума за всеки customer_id (10 + 15), което ще бъде "deposit_first_sum".

Едно ограничение тук е, страхувам се, че не мога да използвам „ляво присъединяване (ИЗБЕРЕТЕ ... ОТ депозит) като депозит“, защото отнема много памет, докато получава всички редове за депозити от таблицата с депозити.

Видях интересен отговор тук Суми стойности от една колона, ако Индексната колона е различна? Но е за MSSQL.

Така че въпросът е: има ли начин да се сумират всички първи депозити без да се използва JOIN(SELECT) или може би има начин с JOIN(SELECT), но с някакъв трик за икономия на памет?

АКТУАЛИЗИРАНЕ. Можем също да използваме deposit.account_id, който е свързан с таблицата на акаунта.


person Pavel Bariev    schedule 17.04.2015    source източник
comment
може да публикува набора от резултати от текущата заявка?   -  person Avidos    schedule 17.04.2015
comment
... депозитни записи customer_id, а не account_id?   -  person pala_    schedule 17.04.2015
comment
и ще има ли потребител повече от един акаунт?   -  person pala_    schedule 17.04.2015
comment
pala_ Да, можем също да присъединяваме депозити по техния account_id и да, потребителят има много акаунти.   -  person Pavel Bariev    schedule 17.04.2015


Отговори (1)


Тази заявка ще ви даде customer_id и amount за първия им депозит, без да използвате подзаявка.

select d1.customer_id, d1.amount
  from deposit d1
    left join deposit d2
      on d1.customer_id = d2.customer_id and d1.id > d2.id
  where d2.id is null;

очевидно можете да получите и sum:

select sum(d1.amount) total_first_deposit
  from deposit d1
    left join deposit d2
      on d1.customer_id = d2.customer_id and d1.id > d2.id
  where d2.id is null;

Можете също така да получите общата сума, както и сумата на първите депозити по този начин:

select sum(d3.amount) total_deposit, sum(case when d3.id = d1.id then d3.amount end) total_first_deposit
  from deposit d1
    left join deposit d2
      on d1.customer_id = d2.customer_id and d1.id > d2.id
    inner join deposit d3
      on d1.customer_id = d3.customer_id and d2.id is null
person pala_    schedule 17.04.2015
comment
трябва да знам повече за връзката между таблиците, преди да мога да включа таблицата account в отговора. по-специално, ако един потребител може да има повече от един акаунт. ако могат, депозит наистина трябва да бъде записан срещу сметката, а не на клиента, в противен случай това става... болезнено - person pala_; 17.04.2015
comment
Благодаря ти! Присъединяването чрез account_id беше ключът към този проблем. - person Pavel Bariev; 17.04.2015
comment
ах страхотно. да, винаги щеше да бъде трудно преминаването от депозит, към клиент, към сметка. - person pala_; 17.04.2015