首页 > 解决方案 > SQL 返回时间范围内第一次出现的结果

问题描述

我只想在购买日期后 1 年内的指定时间范围内返回每个用户 ID 的第一个处理日期交易。

从我们所拥有的:

User ID     Transaction Purchase D  Process Date
ZZ1316567   11004463720 10/4/2018   3/9/2020
ZZ1316567   41004401606 10/4/2018   1/9/2019
ZZ1316567   41004413203 10/4/2018   5/10/2019
ZZ1316567   41004447152 10/4/2018   10/23/2019
ZZ1316567   41004462755 10/4/2018   10/23/2019
VV1454366   41004457424 4/27/2017   12/11/2019
VV1454366   51004365427 4/27/2017   8/10/2018
VV1454366   11004401749 3/24/2017   12/20/2018
SS1456449   41004315438 3/24/2017   10/31/2017
SS1456449   41004323671 3/24/2017   12/14/2017
SS1456449   41004329229 3/24/2017   1/15/2018
SS1456449   41004356097 3/24/2017   6/11/2018
SS1456449   51004292754 3/24/2017   6/7/2017
SS1456449   51004334495 3/24/2017   1/15/2018
TT1474544   11004409317 6/30/2017   4/14/2019
TT1474544   41004428284 6/30/2017   8/7/2019

这个:

    Select *

    From (
        Select Distinct USER_ID, Transaction, Purchase_date, Process_date
        Row_Number() OVER (PARTITION BY USER_ID ORDER BY Transaction) AS Uniqueness
        From Table1
        Where Purchase_date between DATEADD(YEAR,-4,GetDate()) and GetDate() 
        AND Purchase_date < DATEADD(year, 1, process_date)
    ) As Z

    Where Uniqueness = 1

我想要的是它仅限于此,因为以下这些是列表中唯一的交易,其交易处理日期在购买日期后 1 年内,并且是这些交易中的第一笔交易,即使在那段时间内同一用户还有另一笔交易-frame 即排除不符合此标准的任何和所有内容:

User ID     Transaction Purchase Date   Process Date
ZZ1316567   41004401606 10/4/2018       1/9/2019
SS1456449   51004292754 3/24/2017       6/7/2017

我错过了什么?我要解决这个问题了吗?

标签: sqlsql-server

解决方案


唯一的问题是“交换Purchase_dateProcess_date”。

只需进行如下更改,您应该会得到所需的结果:

AND process_date < DATEADD(year, 1, Purchase_date)

另外,请按照@avery_larryProcess_date的建议使用。order by


推荐阅读