如何在MySql中使用group by查询非聚合列?

时间:2019-06-26 02:23:22

标签: mysql sql

我有一个用例,我想获取用户在前一天进行的最新交易,
例如。如果今天是2019年6月26日,
我想获取the last transaction made by the user on 25th June 2019 at 23:59:59

我的数据就是这样-

enter image description here

我不太擅长SQL,并尝试了以下查询-

SELECT MAX(transaction_id), user_id, MAX(created_date), new_balance  
FROM transaction
where created_date < 1561507199 
GROUP BY user_id;

我遇到以下错误-

Error Code: 1055. Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'transaction.new_balance' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

2 个答案:

答案 0 :(得分:1)

您的位置接近/在正确的轨道上。对于给定的用户,您希望该用户LESS的最高交易ID高于给定的相关创建日期。一旦有了,就从交易表中获取完整的明细行。

select
      T2.*
   from
      ( select user_id, max( transaction_id ) maxTransID
           from transaction
           where created_date < 1561507199
           group by user_id ) Tmp
         JOIN Transaction T2
            on Tmp.MaxTransID = T2.Transaction_ID

我们可以加入最大交易ID,因为它只会对一个用户存在。

答案 1 :(得分:0)

您可以将ANY_VALUE用于未聚合的列。在您的情况下,未汇总的列为new_balance。因此,您可以使用:

SELECT MAX(transaction_id), user_id, MAX(created_date), ANY_VALUE(new_balance)
FROM transaction
where created_date < 1561507199 
GROUP BY user_id;

更多详细信息here