Как я могу получить максимальное значение для каждой страны - PullRequest
0 голосов
/ 28 апреля 2018

Я использую Oracle Oracle. у меня есть две таблицы

сделки:

╔════╤═══════╗
║ 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;

что я должен изменить, чтобы получить максимальное значение для каждой страны?

Ответы [ 6 ]

0 голосов
/ 29 апреля 2018
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
0 голосов
/ 28 апреля 2018

Это может сработать:

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;

Это позволит получить все значения для каждой страны и ранжировать их, а затем получить только то, которое имеет самый высокий ранг. Если вы также хотите получить галстуки, используйте RANK() вместо ROW_NUMBER():

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;

Надеюсь, это поможет.

0 голосов
/ 28 апреля 2018

Попробуйте это.

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

0 голосов
/ 28 апреля 2018

Вы должны сначала найти максимум для каждой страны и сделать еще одно объединение для секса, например:

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
0 голосов
/ 28 апреля 2018

Это может привести к требуемому результату

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;
0 голосов
/ 28 апреля 2018

Традиционный метод не использует подзапрос, а просто 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...