如何通过检查两列的值来获取每个组的最高价值

时间:2019-05-15 06:26:32

标签: mysql sql group-by subquery inner-join

我下面有这个表test_table

USER_ID | YEAR | MONEY
----------------------
  1     |  0   |  0
  1     | 12   | 12
  1     | 48   | 12
  2     | 15   | 15
  2     | 10   | 20
  3     |  0   |  0

所以我想退还钱最高的那一行。例如,行返回将是这样

USER_ID | YEAR | MONEY
----------------------
  1     | 12   | 12
  1     | 48   | 12
  2     | 10   | 20
  3     |  0   |  0

但是,因为用户ID 1具有相同的货币价值,所以我想检查该货币金额的最高年份并返回结果。预期结果应该是

USER_ID | YEAR | MONEY
----------------------
  1     | 48   | 12
  2     | 10   | 20
  3     |  0   |  0

是否有可能获得这样的行?

此处是在线测试您的查询的链接 http://sqlfiddle.com/#!9/2e5660/1

2 个答案:

答案 0 :(得分:1)

您可以尝试使用相关子查询

DEMO

<p style="text-align: right;"><a href="#" target="_blank">Daha fazlasını öğrenin</a></p>

 body {
    font-family: "Proxima Nova",Arial,sans-serif;
    text-rendering: optimizeLegibility;
}

输出:

select userid, moneyval,max(year) as year
from
(
select * from t a
where moneyval in 
(select max(moneyval) from t b where a.userid=b.userid)
)A group by userid, moneyval

答案 1 :(得分:0)

您可以使用不存在来获取货币(和年份)最大值的行:

  select t.*
  from test_table t 
  where not exists (
    select 1 from test_table
    where userid = t.userid and (
      money > t.money or (money = t.money and year > t.year)
    )  
  ) 

请参见typing
结果:

| userid | money | year |
| ------ | ----- | ---- |
| 1      | 12    | 48   |
| 2      | 20    | 10   |
| 3      | 0     | 0    |