如何解决查找每个组最近一年交易的最长时间
我必须在sql server中查询,我必须在其中查找每个id的数量,以便每个id的数量都具有最近1年的日期。
例如下面是我的数据,
对于每个ID,我需要查询ID条目的最后一年的交易,正如您从ID 1的代码段中看到的那样,我们的最新日期为2020年7月31日,因此我需要最近1年条目,由于该日期距该ID的最新日期已超过1年,因此排除了突出显示的一个 >
类似地,对于ID 3,我们拥有该特定ID的最近日期起一年内的所有日期范围
我尝试使用以下查询,可以获取每个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 举报,一经查实,本站将立刻删除。