我必须在sql server中查询,我必须在其中查找每个id的数量,以便每个id的数量都具有最近1年的日期。
例如下面是我的数据,
对于每个ID,我需要查询ID条目的最后一年的交易,正如您从ID 1的代码段中看到的那样,我们的最新日期为2020年7月31日,因此我需要<对于该ID,从该日期开始最近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
答案 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;