सबसे पहले, आइए कुछ परीक्षण डेटा बनाते हैं:
create table client (client_id integer not null primary key auto_increment,
name varchar(64));
create table portfolio (portfolio_id integer not null primary key auto_increment,
client_id integer references client.id,
cash decimal(10,2),
stocks decimal(10,2));
insert into client (name) values ('John Doe'), ('Jane Doe');
insert into portfolio (client_id, cash, stocks) values (1, 11.11, 22.22),
(1, 10.11, 23.22),
(2, 30.30, 40.40),
(2, 40.40, 50.50);
यदि आपको पोर्टफोलियो आईडी की आवश्यकता नहीं है, तो यह आसान होगा:
select client_id, name, max(cash + stocks)
from client join portfolio using (client_id)
group by client_id
+-----------+----------+--------------------+
| client_id | name | max(cash + stocks) |
+-----------+----------+--------------------+
| 1 | John Doe | 33.33 |
| 2 | Jane Doe | 90.90 |
+-----------+----------+--------------------+
चूंकि आपको पोर्टफोलियो आईडी की आवश्यकता है, चीजें और अधिक जटिल हो जाती हैं। आइए इसे चरणों में करें। सबसे पहले, हम एक सबक्वेरी लिखेंगे जो प्रत्येक क्लाइंट के लिए अधिकतम पोर्टफोलियो मान लौटाएगी:
select client_id, max(cash + stocks) as maxtotal
from portfolio
group by client_id
+-----------+----------+
| client_id | maxtotal |
+-----------+----------+
| 1 | 33.33 |
| 2 | 90.90 |
+-----------+----------+
फिर हम पोर्टफ़ोलियो तालिका को क्वेरी करेंगे, लेकिन पिछली सबक्वेरी में शामिल होने का उपयोग केवल उन पोर्टफ़ोलियो को रखने के लिए करेंगे जिनका कुल मूल्य क्लाइंट के लिए अधिकतम है:
select portfolio_id, cash + stocks from portfolio
join (select client_id, max(cash + stocks) as maxtotal
from portfolio
group by client_id) as maxima
using (client_id)
where cash + stocks = maxtotal
+--------------+---------------+
| portfolio_id | cash + stocks |
+--------------+---------------+
| 5 | 33.33 |
| 6 | 33.33 |
| 8 | 90.90 |
+--------------+---------------+
अंत में, हम प्रत्येक क्लाइंट का नाम शामिल करने के लिए क्लाइंट टेबल (जैसा आपने किया) में शामिल हो सकते हैं:
select client_id, name, portfolio_id, cash + stocks
from client
join portfolio using (client_id)
join (select client_id, max(cash + stocks) as maxtotal
from portfolio
group by client_id) as maxima
using (client_id)
where cash + stocks = maxtotal
+-----------+----------+--------------+---------------+
| client_id | name | portfolio_id | cash + stocks |
+-----------+----------+--------------+---------------+
| 1 | John Doe | 5 | 33.33 |
| 1 | John Doe | 6 | 33.33 |
| 2 | Jane Doe | 8 | 90.90 |
+-----------+----------+--------------+---------------+
ध्यान दें कि यह जॉन डो के लिए दो पंक्तियाँ देता है क्योंकि उसके पास समान कुल मूल्य वाले दो पोर्टफोलियो हैं। इससे बचने के लिए और मनमाना शीर्ष पोर्टफोलियो चुनने के लिए, ग्रुप बाय क्लॉज पर टैग करें:
select client_id, name, portfolio_id, cash + stocks
from client
join portfolio using (client_id)
join (select client_id, max(cash + stocks) as maxtotal
from portfolio
group by client_id) as maxima
using (client_id)
where cash + stocks = maxtotal
group by client_id, cash + stocks
+-----------+----------+--------------+---------------+
| client_id | name | portfolio_id | cash + stocks |
+-----------+----------+--------------+---------------+
| 1 | John Doe | 5 | 33.33 |
| 2 | Jane Doe | 8 | 90.90 |
+-----------+----------+--------------+---------------+