Как получить запись для наибольшего значения на основе типа и 2 столбцов - PullRequest
1 голос
/ 15 мая 2019

Итак, у меня есть таблица my_table

| userid | gender | year | money |
| ------ | ------ | ---- | ----- |
| 1      | B      | 12   | 50    |
| 1      | B      | 24   | 150   |
| 1      | B      | 36   | 5     |
| 1      | G      | 0    | 0     |
| 1      | G      | 12   | 120   |
| 1      | G      | 48   | 120   |
| 2      | B      | 12   | 23    |
| 2      | B      | 24   | 56    |
| 2      | G      | 36   | 23    |
| 3      | G      | 0    | 234   |
| 3      | G      | 12   | 34    |
| 4      | G      | 0    |  0    |

Я хочу вернуть строку с максимальными доступными деньгами в зависимости от пола.Так, например, таблица возврата для пола B будет выглядеть как

| userid | gender | year | money |
| ------ | ------ | ---- | ----- |
| 1      | B      | 24   | 150   |
| 2      | B      | 24   | 56    |

А таблица возврата для пола G будет выглядеть как

| userid | gender | year | money |
| ------ | ------ | ---- | ----- |
| 1      | G      | 12   | 120   |
| 1      | G      | 48   | 120   |
| 2      | G      | 36   | 23    |
| 3      | G      | 0    | 234   |
| 4      | G      | 0    | 0     |

Но так как таблица для пола G дублироваласьстоимость денег, я хочу, чтобы вернуть строку с самым высоким годом.Ожидаемая таблица для пола G:

| userid | gender | year | money |
| ------ | ------ | ---- | ----- |
| 1      | G      | 48   | 120   |
| 2      | G      | 36   | 23    |
| 3      | G      | 0    | 234   |
| 4      | G      | 0    | 0     |

То, что я пробовал: http://sqlfiddle.com/#!9/5433cbc/2 Я могу получить таблицу для пола B, но не для пола G.

Что яПопытка достичь - это сгенерировать таблицу, объединяющую обе таблицы выше по полу.Пример,

| userid | year_b | max_money_for_b | year_g | max_money_for_g |
| ------ | ------ | --------------- | ------ | --------------- |
| 1      | 24     | 150             | 48     | 120             |
| 2      | 24     | 56              | 36     | 23              |
| 3      | null   | null            | 0      | 234             |
| 4      | null   | null            | 0      | 0               |

Ответы [ 3 ]

1 голос
/ 15 мая 2019

Как показано ниже, я думаю, вы получите правильные результаты.

select
    m.userid,
    m.gender,
    tmp1.m_money as money,
    tmp2.m_year as year
from
    my_table m
join
(
select
    gender,
    userid,
    max(money) as m_money
from
    my_table
group by
    gender,
    userid
) tmp1 on m.gender = tmp1.gender and m.userid=tmp1.userid and m.money=tmp1.m_money
join
(
select
    gender,
    userid,
    money,
    max(year) as m_year
from
    my_table
group by
    gender,
    userid,
    money
) tmp2 on m.gender = tmp2.gender and m.userid=tmp2.userid and m.money=tmp2.money and m.year=tmp2.m_year
where m.gender='G'
order by m.gender,m.userid

Если вы используете PostgreSQL или MySQL, версия которого больше 8.0, все будет проще, вы можете просто использовать оконную функцию для реализации ваших требований. Как показано ниже:

select * from 
(
select
    user_id,
    gender,
    money,
    year,
    row_number() over(partition by userid,gender order by money desc,year desc) as sort
from
    my_table
) tmp where sort = 1
1 голос
/ 15 мая 2019

Я думаю, что коррелированный подзапрос - самый простой подход в MySQL:

select t.*
from my_table t
where t.gender = 'G' and
      (t.year, t.money) = (select t2.year, t2.money
                           from my_table t2
                           where t2.userid = t.userid and
                                 t2.gender = t.gender
                           order by t2.money desc, t2.year desc
                           limit 1
                          );
0 голосов
/ 15 мая 2019

удалите условие gender = 'G' из вашего текущего состояния

DEMO

select t.* from my_table t where
not exists (
    select 1 from my_table where userid = t.userid and money > t.money
        or (money = t.money and year > t.year)
    ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...