【问题标题】:Find the max date to last one year transaction for each group查找每个组的最后一年交易的最大日期
【发布时间】:2020-09-28 15:29:54
【问题描述】:

我必须在 sql server 中查询我必须为每个 id 找到它的卷,这样我们就有每个 id 的最后 1 年日期和它的卷。

例如下面是我的数据,

对于每个 id,我需要从我们有该 id 条目的时间开始查询最近 1 年的交易,正如您从 id 1 的 sn-p 中看到的那样,我们的最新日期为 2020 年 7 月 31 日,所以我需要该ID的过去1年条目从该日期开始突出显示的条目是排除的,因为该日期距该ID的最近日期超过1年

同样,对于 ID 3,我们拥有从该特定 ID 的最新日期算起一年内的所有日期范围

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

我使用的是 Microsoft sql server 需要在 sql server 中执行的查询,表名为 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 


【问题讨论】:

    标签: sql sql-server datetime sum ssms


    【解决方案1】:

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

    更新:每 cmets,增加的音量。谢谢专线小巴:)

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

    【讨论】:

    • 不是从当前 sys 日期开始,而是从每个 id 的最新日期到最近 1 年的日期,如果您看到 id 1,则最新日期是 2020 年 7 月 31 日,从那个日期到最后 1我需要提取的年份而不是当前的系统日期
    • 对不起,读错了。它已更新。现在它使用每个 id 的 max_date 来返回小于或等于 365 天前的交易
    • 记住函数不能使用索引
    • @SteveC,谢谢,现在基于提取的结果。如果我只想在 365 天内为每个 id 计算 vol 的总和需要做什么,如果可能的话,你能否在查询中更新它
    • 已更新,请查看
    【解决方案2】:

    您可以使用窗口函数来做到这一点:

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

    【讨论】:

      【解决方案3】:

      这应该可以为您解决问题:

      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;
      

      【讨论】:

        【解决方案4】:

        你的代码很好。只需添加日期差异函数即可获取交易之间的特定时间,如下所示:

        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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-04
          • 2017-04-24
          • 2021-05-23
          • 1970-01-01
          • 2020-07-10
          • 2019-08-19
          • 1970-01-01
          相关资源
          最近更新 更多