微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决查找每个组最近一年交易的最长时间

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

例如下面是我的数据,

对于每个ID,我需要查询ID条目的最后一年的交易,正如您从ID 1的代码段中看到的那样,我们的最新日期为2020年7月31日,因此我需要最近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 


解决方法

要排除每个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;
,

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

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,max(t1.date_tran))
    from mytable t1
    where t1.id = t.id
)

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

,

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

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,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,emp2.max_date_tran) <= emp.date_tran;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。