返回过去 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 创建的项目的报告?
SQL Server 按过去 24 小时、上周和上个月对促销进行分组,并按周降序排序