查找每个组的最后一年交易的最大日期

Find the max date to last one year transaction for each group

我必须在 sql 服务器中查询,我必须在其中为每个 ID 找到它的数量,以便我们有每个 ID 的最后 1 年日期及其数量。

例如下面是我的数据,

对于每个 ID,我需要从我们拥有该 ID 的条目时查询最近 1 年的交易,正如您从 ID 1 的代码片段中看到的那样,我们的最新日期是 7/31/2020,所以我需要过去 1 年 条目 从那个日期 对于那个 id,突出显示的是排除的,因为那个日期超过 1 年从该 ID 的最新日期开始

与 Id 3 类似,我们拥有从该特定 id 的最新日期起一年内的所有日期范围

我尝试使用以下查询,我可以获得每个 ID 的最新日期,但我不确定如何提取每个 ID 从最新日期到一年的所有日期,如果有人可以,我将不胜感激帮帮我。

我正在使用 Microsoft sql 服务器需要在 sql 服务器中执行的查询,Table 名称是 emp 并拥有数百万个id

Select *
From emp as t
inner join (
    Select tm.id, max(tm.date_tran) as MaxDate
    From emp tm
    Group by tm.id
) tm on t.id = tm.id and t.date_tran = tm.MaxDate 


要排除每个 ID 的 tran_date 和最大值 tran_date 之间的日期差异大于 1 年的交易,如下所示:

;with max_cte(id, max_date) as (
    Select id, max(date_tran)
    From emp tm
    Group by id )
Select *
From emp e
     join max_cte mc on e.id=mc.id
                        and datediff(d, e.date_tran, mc.max_date)<=365;

更新:根据评论,增加了数量。感谢专线小巴 :)

;with max_cte(id, date_tran, volume, max_date) as (
    Select *, dateadd(year, -1, max(date_tran) over(partition by id)) max_date
    From #emp tm)
Select id, sum(volume) sum_volume
From max_cte mc
where mc.date_tran>max_date
group by id;

你的代码很好。只需添加日期差异函数即可获取交易之间的特定时间,如下所示:

Select *
From emp as t
inner join ( Select id as id, max(date_tran) as maxdate
    From emp tm
    Group by id
) tm on t.id = tm.id and datediff(d, e.date_tran, mc.maxdate)<=365;

这应该可以解决您的问题:

SELECT
    *
FROM
    emp
    JOIN
        (
            SELECT
                MAX(date_tran) max_date_tran
                , Id
            FROM
                emp
            GROUP BY
                id
        ) emp2
        ON emp2.Id = emp.Id
           AND DATEADD(YEAR, -1, emp2.max_date_tran) <= emp.date_tran;

您可以使用 window 函数执行此操作:

select id, sum(volume) total_volume
from (
    select t.*, max(date_tran) over(partition by id) max_date_tran
    from mytable t
) t
where date_tran > dateadd(year, -1, max_date_tran)
group by id

或者,您可以使用相关子查询进行过滤:

select id, sum(volume) total_volume
from mytable t
where t.date_tran > (
    select dateadd(year, -1, max(t1.date_tran))
    from mytable t1
    where t1.id = t.id
)

第二个查询将利用 (id, date_tran) 上的索引。