我有一个 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/