如何在sql查询中获得最后3个事务的总和

时间:2017-03-04 07:11:12

标签: sql ms-access

我有一个表名注意者,我想获得每个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

2 个答案:

答案 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;