查找每个组最近一年交易的最长时间

时间:2020-09-28 15:29:54

标签: sql sql-server datetime sum ssms

我必须在sql server中查询,我必须在其中查找每个id的数量,以便每个id的数量都具有最近1年的日期。

例如下面是我的数据,

对于每个ID,我需要查询ID条目的最后一年的交易,正如您从ID 1的代码段中看到的那样,我们的最新日期为2020年7月31日,因此我需要<对于该ID,从该日期开始最近1年条目,由于该日期距该ID的最新日期已超过1年,因此排除了突出显示的一个 >

类似地,对于ID 3,我们拥有该特定ID的最近日期起一年内的所有日期范围

enter image description here

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

我正在使用Microsoft sql服务器,需要在sql服务器中执行的查询,表名称为 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 


4 个答案:

答案 0 :(得分:1)

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

nil

更新:根据评论,增加了音量。 Thnx GMB:)

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

答案 1 :(得分:1)

您可以使用窗口功能来做到这一点:

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)上的索引。

答案 2 :(得分:0)

您的代码是好的。只需添加日期差功能即可获取交易之间的特定时间,如下所示:

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;

答案 3 :(得分:0)

这应该为您解决问题:

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;