mysql - 根据其他 2 列的总和查找每个键的前 N ​​个项目

标签 mysql sql

我有一个 MySQL 表 (Amazon Aurora),其中每行包含一个时间戳、一个账户 ID、账户 A 的金额(以美元为单位)和账户 B 的金额(以美元为单位)。行如下所示:

1462791600     123     100     200 

对于每个时间戳,我想找到前 10 张发票(帐户 A + B 的美元金额最高的发票)。我可以在 MySql 中执行此操作吗?我对 SQL 没有太多经验,但这就是我想要做的:

SELECT ts, id, account_A + account_B AS account_sum
FROM table
GROUP BY ts
ORDER BY account_sum
LIMIT 10

上述 SQL 的问题是它没有为每个时间戳提供前 10 个值。我不知道如何用 SQL 编写部分。

最佳答案

我不明白为什么此查询需要group by。然而,在 MySQL 中做到这一点很棘手。这是使用变量的方法:

SELECT t.*
FROM (SELECT t.*,
             (@rn := if(@ts = ts, @rn + 1,
                        if(@ts := ts, 1, 1)
                       )
             ) as rn
      FROM table t CROSS JOIN
           (SELECT @rn := 0, @ts := -1) params
      ORDER BY ts, (account_A + account_B) DESC
     ) t
WHERE rn <= 10;

这并不明显。上面的公式使用变量来模仿几乎所有其他数据库中可用的 ROW_NUMBER() 函数。

它枚举每个时间戳的行。外部查询只是为每个时间戳选择前 10 个。

关于mysql - 根据其他 2 列的总和查找每个键的前 N ​​个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38587686/

相关文章:

sql - 存储过程中是否需要 "SET NOCOUNT OFF"?

SQL 连接 postgresql 上的许多表

php - 用于更新数据库条目的多个 if 语句

php - 提高teSTLink性能的方法有哪些

php - WHERE 或 HAVING 用于 MYSQL Month() 查询

php - 获取 Laravel 上当天的所有服务

mysql 根据重复集和时间删除一些条目

MySQL:如何将列别名与特定的 JOIN 子句相关联

mysql - 修复多列唯一约束 E 上的 "maximum key length...."警告的最佳方法

sql - 在 PostgreSQL 中加入三个表后计算行数