मैं ओरेकल एसक्यूएल डेवलपर का उपयोग कर रहा हूँ। मेरे पास दो टेबल हैं

लेनदेन:

╔════╤═══════╗
║ id │ value ║
╠════╪═══════╣
║ 1  │ 10    ║
╟────┼───────╢
║ 1  │ 20    ║
╟────┼───────╢
║ 2  │ 30    ║
╟────┼───────╢
║ 3  │ 40    ║
╚════╧═══════╝

और उपयोगकर्ता:

╔════╤═════════╤═════╗
║ id │ country │ sex ║
╠════╪═════════╪═════╣
║ 1  │ Germany │ m   ║
╟────┼─────────┼─────╢
║ 2  │ Germany │ f   ║
╟────┼─────────┼─────╢
║ 3  │ France  │ m   ║
╚════╧═════════╧═════╝

मैं इस तरह प्रत्येक देश के लिए अधिकतम मूल्य प्राप्त करना चाहता हूं

╔════╤═════════╤═════╤══════════╗
║ id │ country │ sex │ maxvalue ║
╠════╪═════════╪═════╪══════════╣
║ 2  │ Germany │ f   │ 30       ║
╟────┼─────────┼─────┼──────────╢
║ 3  │ France  │ m   │ 40       ║
╚════╧═════════╧═════╧══════════╝

मुझे पता है कि प्रत्येक उपयोगकर्ता के लिए अधिकतम मूल्य कैसे प्राप्त करें और तालिकाओं में शामिल हों

SELECT u.*, max
FROM users u
LEFT JOIN
(SELECT id, max(value) as max
FROM transactions 
group by ID) t
on u.id = t.id;

प्रत्येक देश के लिए अधिकतम मूल्य प्राप्त करने के लिए मुझे क्या बदलना चाहिए?

2
riloth 28 अप्रैल 2018, 17:13

6 जवाब

सबसे बढ़िया उत्तर

ये कोशिश करें।

select tmp.country, tmp.maxvalue, tmp.id, users.sex from (
select users.country as country, max(transactions.value) as maxvalue, max(users.id) as id 
from users
inner join transactions on users.id = transactions.id
group by users.country) tmp
inner join users on tmp.id = users.id;

डेमो: http://www.sqlfiddle.com/#!4/5f476/ 27/0

1
DxTx 28 अप्रैल 2018, 18:23

यह काम कर सकता है:

SELECT id, country, sex, value AS maxvalue FROM (
    SELECT u.id, u.country, u.sex, COALESCE(t.value, 0) AS value
         , ROW_NUMBER() OVER ( PARTITION BY u.country ORDER BY t.value DESC NULLS LAST ) AS rn
      FROM users u LEFT JOIN transactions t
        ON u.id = t.id
) WHERE rn = 1;

यह प्रत्येक देश के लिए सभी मान प्राप्त करेगा और उन्हें रैंक करेगा, फिर केवल शीर्ष रैंक वाले एक को पुनः प्राप्त करेगा। यदि आप भी संबंध बनाना चाहते हैं तो ROW_NUMBER() के बजाय RANK() का उपयोग करें:

SELECT id, country, sex, value AS maxvalue FROM (
    SELECT u.id, u.country, u.sex, COALESCE(t.value, 0) AS value
         , RANK() OVER ( PARTITION BY u.country ORDER BY t.value DESC NULLS LAST ) AS rn
      FROM users u LEFT JOIN transactions t
        ON u.id = t.id
) WHERE rn = 1;

उम्मीद है ये मदद करेगा।

2
David Faber 28 अप्रैल 2018, 18:20

पारंपरिक विधि एक सबक्वेरी का उपयोग नहीं करेगी, लेकिन केवल join और group by:

SELECT u.country, MAX(t.value)
FROM users u LEFT JOIN
     transactions t
     ON u.id = t.id
GROUP BY u.country;
1
Gordon Linoff 28 अप्रैल 2018, 17:15

यह आवश्यक परिणाम प्राप्त कर सकता है

SELECT u.id, u.country, u.sex, MAX(t.value)
FROM users u 
LEFT JOIN transactions t ON u.id = t.id
GROUP BY u.id, u.country, u.sex;
1
Inaam ur Rehman 28 अप्रैल 2018, 17:24

आपको पहले प्रति देश अधिकतम खोजना होगा और दूसरे को सेक्स के लिए शामिल करना होगा, जैसे:

SELECT u.*, t.value
FROM transactions t
INNER JOIN users u ON t.id = u.id
INNER JOIN
(SELECT us.country, MAX(tr.value) AS max_value
 FROM transactions tr
 INNER JOIN users us ON tr.id = us.id
 GROUP BY us.country) sub ON t.value = sub.value AND u.country = sub.country
1
kjmerf 28 अप्रैल 2018, 18:01
select * from (
SELECT t.ID, u.COUNTRY, T.VALUE, 
row_number() over(partition by u.country order by t.value desc) rn
FROM USERS u , transactions t
where u.id = t.id)
where rn = 1
1
Leo 29 अप्रैल 2018, 19:21