我有一个表名注意者,我想获得每个mem_id的最后3个事务的总和 我编写查询以获取每个mem_id的所有事务的总和。但我不知道如何获得每个成员的最后3个事务的总和。
我正在使用ms accsess数据库谢谢 我的表数据是
CREATE TABLE `attendents` (
`tr_id` INTEGER,
`mem_id` NUMERIC,
`result` INTEGER,
PRIMARY KEY(`tr_id`)
);
我当前的查询是
select mem_id,sum(result)
from attendents
group by mem_id
;
我的表数据是
tr_id | mem_id |结果
1 1 1
2 2 0
3 1 0
4 2 1
5 1 1
6 2 1
7 1 0
8 2 1
然后最后3个事务总和应该是mem_id 1 = 1而mem_id 2 = 3
答案 0 :(得分:0)
select mem_id,sum(result)
from (select top(3) mem_id, result from attendents order by tr_id desc)
group by mem_id
;
答案 1 :(得分:0)
目前尚不清楚您使用的是哪个DBMS。
如果您使用 MS Access
,请使用TOP
:
select a.mem_id,
Sum(a.result) as SumOfresult
from attendents as a
where a.tr_id in (
select top 3 tr_id
from attendents a2
where a.mem_id = a2.mem_id
order by tr_id desc
)
group by a.mem_id;
如果您使用 MySQL
,则可以使用用户变量生成分区序列号,以便稍后在where子句中使用,以将事务限制为最新的三个。
select
mem_id,
sum(result)
from (
select
t.*,
@rn := if(
@mem_id = mem_id,
@rn + 1,
if(@mem_id := mem_id, 1, 1)
) rn
from (
select *
from attendents
order by mem_id, tr_id desc
) t cross join (select @mem_id := -1, @rn := 0) t2
) t where rn <= 3
group by mem_id;
如果您使用的是 SQL server
,则会更容易。您可以使用窗口函数row_number来生成序列号:
select mem_id, sum(result)
from (
select a.*, row_number() over (
partition by mem_id order by tr_id desc
) seqnum
from attendents a
) t
where seqnum <= 3
group by mem_id;
在 SQLite
中,您可以使用相关子查询将行限制为每个mem_id最新的三个事务(假设tr_id是唯一的):
select mem_id, sum(result)
from attendents a
where tr_id in (
select tr_id
from attendents a2
where a.mem_id = a2.mem_id
order by tr_id desc limit 3
)
group by mem_id;