查找每个组的最后一年交易的最大日期
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)
上的索引。
我必须在 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)
上的索引。