我有一组数据,显示每家公司的交易情况和交易发生的日期.

我创建了一个新的列,显示交易发生前5年的日期(deal_date_5y_back).

company_id deal_id deal_date deal_date_5y_back
86 1 2006-02-27 2001-02-27
86 2 2012-04-01 2007-04-01
86 3 2015-03-23 2010-03-23
86 4 2018-09-19 2013-09-19

我想创建一个新列,统计每一家公司和每一家deal_date之间的交易数量.

从本质上讲,我想写一些类似下面的count over partition by条款中的内容,但我不确定如何做到这一点.

select 
    company_id
    , deal_date
    , count(distinct deal_id) over (partition by company_id, deal_date where deal_date between deal_date_5yb and dateadd(day, -1, deal_date) ) num_deals_5y_back
from 
    (select 
         company_id, deal_id, deal_date, 
         dateadd(year, -5, deal_date) deal_date_5y_back
     from 
         DEALS_TABLE
     where 
         deal_date is not null) T
group by 
    company_id, deal_date

我预计的输出是:

company_id deal_id deal_date deal_date_5yb num_deals_5yb
86 1 2006-02-27 2001-02-27 0
86 2 2012-04-01 2007-04-01 0
86 3 2015-03-23 2010-03-23 1
86 4 2018-09-19 2013-09-19 0

如有任何帮助,我们不胜感激!

推荐答案

在SQL Server中,横向联接可能是最简单的方法:

select d.*, d1.*
from deals_table d
cross apply (
    select count(*) num_deals_5y_back
    from deals_table d1
    where d1.company_id = d.company_id
      and d1.deal_date >= dateadd(year, -5, d.deal_date)
      and d1.deal_date <  d.deal_date
) d1

100


值得注意的是:在支持窗口函数的range子句中的标准日期算法的数据库中,我们可以在不使用子查询的情况下做到这一点:

select d.*,
    count(*) over(
        partition by company_id
        order by deal_date
        range between interval '5' year preceding and current row
    ) - 1 num_deals_5y_back
from deals_table d

这是works in Postgresin Oracle as well--可惜不是在SQL Server中,而是the documentation points out:

<unsigned value specification> FOLLOWING

指定为,以指示要 跟随当前行.[..].此规格不允许用于 射程.

try 设置为force the use of such clause时会出现以下错误消息:

仅无界和当前行窗口框架分隔符支持范围

Sql相关问答推荐

如何在联接条件不匹配时按日期获取上一条记录

为什么在postgres中,横向连接比相关子查询快?

按每天的最大值分组

对任何(数组)使用LIKE?

按日期时间(不包括秒)连接表

仅在日期相隔时递增(Oracle SQL)

PostgreSQL中递归CTE查询的故障过滤

使用左外部联接更正列中第+1行的值时重复

为什么SQL in中的空子查询有时被视为null

Select 一个非零值减少重复

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

SQL的左连接在多对多关系情况下使用

如何优化仅返回符合条件的三条记录的查询?

比使用NOT EXISTS更高效的SQL删除方法是什么?

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

String_Split 多列

如何通过存储过程将 root 的下一个子 node 作为父 node ?

snowfalke 会在 Select 运行时锁定表吗?

Oracle SQL 查询自行运行,但在包装到select count(*) from ()时失败

如何根据时间在 MongoDB Compass 中分组?