返回过去 12 个月内没有活动但当月有活动的所有行?

Posted

技术标签:

【中文标题】返回过去 12 个月内没有活动但当月有活动的所有行?【英文标题】:Return all rows with no activity in the past 12 months but have an activity in the current month? 【发布时间】:2021-05-19 21:21:32 【问题描述】:

我有一个如下所示的表格:

SALESPERSON CUSTOMER LOAD_ID DATE
ABC CUST1 001 5/10/2021
ABC CUST2 002 8/18/2020
DFG CUST3 003 6/12/2018

我希望我的查询返回过去 12 个月内没有负载但在 5 月当月有负载的所有客户。所以基本上查询应该返回 Loads 001 和 003。

【问题讨论】:

根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。还请显示所需的结果。如果您将示例数据以 DDL+DML 的形式放置,那么人们可以更轻松地提供帮助。 定义前 12 个月 - 是上一年的同一天,上一年当月的第一天,还是别的什么? @Stu 从 2021-05-01 过去 12 个月。前 12 个月为 2020 年 4 月 1 日至 2021 年 4 月 30 日 【参考方案1】:

您可以使用lag()。我不确定“前 12 个月”是该日期前 12 个月还是前 12 个日历月,但逻辑是这样的:

select t.*
from (select t.*,
            lag(date) over (partition by customer order by date) as prev_date
      from t
     ) t
where date >= datefromparts(year(getdate()), month(getdate()), 1) and
      date < dateadd(day, 1, datefromparts(year(getdate()), month(getdate()), 1)) and
      (prev_date is null or
       prev_date < dateadd(month, -12, datefromparts(year(getdate()), month(getdate()), 1))
     )
  

【讨论】:

.. 一个条件 max(null when date > May) over(customer) as prev_date 也将覆盖 5 月有多个订单的客户 @lptr 。 . .不满足上一个订单在过去 12 个月以上的条件。 …。 dbfiddle.uk/… @lptr 。 . .这是一个解释问题。我认为 OP 希望每个 customer 有一行:“我希望我的查询返回过去 12 个月内没有负载的所有客户。”我承认这个问题有点模棱两可。 ……@Gordon...?【参考方案2】:

有很多方法可以得到结果。我使用了一种方法,这很简单。我们的逻辑是获取大于上一期结束且小于上一期开始的行。如果我没记错的话,基本上数据不会落在前 12 个月之间。

DECLARE @table_sales AS TABLE
(
 SALESPERSON VARCHAR(100)
, CUSTOMER VARCHAR(100)
, LOAD_ID INT
,[DATE] DATE )

INSERT INTO  @table_sales VALUES ('ABC', 'CUST1',001,'2021-05-10')
    ,('ABC', 'CUST2',002,'2020-08-18')
    ,('DFG', 'CUST3',003, '2018-06-12')

--Define the date periods. I used getdate and prepared the data from and date to
DECLARE @StartDate AS DATE = DATEADD(DAY, 1, EOMONTH(GETDATE() , -1))
DECLARE @PreviousFrom AS DATE = DATEADD(YEAR, -1, DATEADD(MONTH, -1, @StartDate) )
DECLARE @PreviousTo AS DATE = DATEADD(DAY,-1, @StartDate)

SELECT *  FROM
@table_sales
WHERE [DATE] > @PreviousTo 
UNION ALL
SELECT *  FROM
@table_sales
WHERE [DATE] < @PreviousFrom 

【讨论】:

以上是关于返回过去 12 个月内没有活动但当月有活动的所有行?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取过去 6 个月内为 sonarqube 创建的项目的报告?

如何返回过去 90 天内没有活动日期的记录?

SQL Server 按过去 24 小时、上周和上个月对促销进行分组,并按周降序排序

有啥好的新的网络开发者浏览器插件吗? (如在过去 6 个月内发布)

计算6个月内的所有日期,而不是整体

在 Forge 中创建活动时出错 [严重]