Sql 行数有限的SUM和GROUP BY

Sql 行数有限的SUM和GROUP BY,sql,postgresql,Sql,Postgresql,我只想对每个用户和每个用户组的最后两周进行总结 我的桌子: +----+------+--------+------+ | ID | User | Income | Week | +----+------+--------+------+ | 1 | John | 50 | 1 | +----+------+--------+------+ | 2 | John | 20 | 2 | +----+------+--------+------+ | 3 | Joh

我只想对每个用户和每个用户组的最后两周进行总结

我的桌子:

+----+------+--------+------+ | ID | User | Income | Week | +----+------+--------+------+ | 1 | John | 50 | 1 | +----+------+--------+------+ | 2 | John | 20 | 2 | +----+------+--------+------+ | 3 | John | 25 | 3 | +----+------+--------+------+ | 4 | John | 10 | 4 | +----+------+--------+------+ | 5 | Mike | 45 | 1 | +----+------+--------+------+ | 6 | Mike | 15 | 2 | +----+------+--------+------+ | 7 | Mike | 10 | 3 | +----+------+--------+------+ | 8 | Mike | 5 | 4 | +----+------+--------+------+ 预期结果:

+------+--------+ | User | Income | +------+--------+ | John | 35 | +------+--------+ | Mike | 15 | +------+--------+ 如您所见,我为每个用户总结了第4周和第3周,因为这是最后两周


提前谢谢

您可以使用行号来为给定用户排序前两周。此后,您可以进行聚合。在postgresql中工作

Select user, sum(income) 
from(
     select user, income, row_number() over (partition by user order by week desc) rn 
     from your_table
    ) 
where rn<3 group by user;

您可以使用行号来为给定用户排序前两周。此后,您可以进行聚合。在postgresql中工作

Select user, sum(income) 
from(
     select user, income, row_number() over (partition by user order by week desc) rn 
     from your_table
    ) 
where rn<3 group by user;
MySql--

SELECT User,Sum(Income) as Income
FROM mytable
WHERE week > (SELECT MAX(week) FROM mytable) - 2
GROUP BY User
PostgreSQL--

SELECT "user",Sum(Income) as Income
FROM mytable
WHERE week > (SELECT MAX(week) FROM mytable) - 2
GROUP BY "user"
MySql--

SELECT User,Sum(Income) as Income
FROM mytable
WHERE week > (SELECT MAX(week) FROM mytable) - 2
GROUP BY User
PostgreSQL--

SELECT "user",Sum(Income) as Income
FROM mytable
WHERE week > (SELECT MAX(week) FROM mytable) - 2
GROUP BY "user"
如果您使用的是mysql,那么请根据用户分组并按周数降序给出行号。然后按用户查找收入组的总和,行号小于3

质疑

如果您使用的是mysql,那么请根据用户分组并按周数降序给出行号。然后按用户查找收入组的总和,行号小于3

质疑


假设您的表名为users,字段为user、income、week:


如果周数是动态的,则可能需要计算where子句值。

假设您的表名为users,字段为user,income,week:


如果您的周数是动态的,那么您可能需要计算where子句的值。

您是否尝试过,然后失败了?你的问题是什么?老兄,老实说,我不知道从哪里开始。我尝试了不同的分组和限制。我只是觉得我远远不能解决这个问题。你在用哪个数据库?您已经标记了mysql和postgresql。您是否尝试过,但失败了?你的问题是什么?老兄,老实说,我不知道从哪里开始。我尝试了不同的分组和限制。我只是觉得我远远不能解决这个问题。你在用哪个数据库?您已经标记了mysql和postgresql。工作起来很有魅力。谢谢工作起来很有魅力。谢谢这种方法的问题是,仅当用于排序的列包含数值时才有效。比如说,我需要使用字母列来排序,而不是按周数字排序。行数方法在任何情况下都有效。如果week是char,它在mysql中仍然有效。但是对于postgresql,您将不得不将Week作为整数。这种方法的问题是,只有当用于排序的列包含数值时,它才有效。比如说,我需要使用字母列来排序,而不是按周数字排序。行数方法在任何情况下都有效。如果week是char,它在mysql中仍然有效。但对于postgresql,您必须将Week转换为整数