【发布时间】:2017-02-16 09:12:44
【问题描述】:
要求:如果客户在 31 天内访问了多次,则仅包括第一次访问。例如,如果客户在 1 月 1 日访问,则包括 1 月 1 日的访问,但不包括 1 月 2 日至 1 月 31 日或之间发生的访问;然后(如果适用)包括在 2 月 1 日或之后发生的下一次访问。按时间顺序确定访问,包括每 31 天仅一次。
CustomerID VisitID VisitDate
1 1 1/1/2016
1 2 1/2/2016
1 3 1/31/2016
1 4 2/1/2016
1 5 7/1/2016
我需要客户在 31 天内的第一个条目,因此在上述情况下,我的结果查询应该只显示两个条目
CustomerID VisitID VisitDate
1 1 1/1/2016
1 4 2/1/2016
1 5 7/1/2016
有没有办法使用存储过程来完成这项工作。
声明@A 表 (CustomerID INT、VisitID INT、VisitDate DATE)
插入@A 值('1' ,'1' ,'1/15/2016') ,('1','2','2/2/2016') ; 有一个 AS (SELECT ROW_NUMBER() OVER (PARTITION BY CONVERT(NVARCHAR(2),DATEPART(MONTH,CONVERT(DATE,VisitDate))) 顺序按 VisitDate) row_id,CustomerID, VisitId,VisitDate FROM @A) SELECT CustomerID, VisitId,VisitDate FROM A WHERE row_id = 1
在上述脚本中,结果条目应仅为“1/15/2016”,因为“1/15/2016”和“2/2/2016”之间的日期差小于 31 天
您提供的 SP 适用于前两个条目,您能否帮助满足以下要求。我发誓这将是我的最后一个查询
- ('1/15/2016'), -- ----- (这是第一次有效访问)
- ('2/2/2016'), --(这是无效访问,因为此访问发生在第一次有效访问后的 31 天内)
- ('3/2/2016'), -- ----- (这是第二次有效访问,因为它发生在第一次有效访问后 31 天)
- ('3/4/2016'), --(这是无效访问,因为此访问发生在第二次有效访问后的 31 天内)
- ('3/15/2016'), --(这是无效访问,因为此访问发生在第 2 次有效访问后的 31 天内)
- ('7/5/2016'), -- ----- (这是第 3 次有效访问,因为它发生在第 2 次有效访问的 31 天后)
- ('8/1/2016'), -- (这是无效访问,因为本次访问 在第 3 次有效访问后的 31 天内发生)
- ('8/7/2016') -- ----- (这是第 4 次有效访问,因为此访问发生在第 3 次有效访问后的 31 天后)
【问题讨论】:
-
列 VisitDate' 数据类型?您使用的是哪个 dbms? (在日期/时间方面,许多产品远不符合 ANSI SQL。而且大多数产品都有自己的存储过程版本。)
-
“31天期限”从什么开始?你能说得更具体一点吗?你也可以给我们看一些代码吗?
-
这里的要求是:如果客户在 31 天内有多次访问,则仅包括第一次访问。例如,如果客户在 1 月 1 日访问,则包括 1 月 1 日的访问,但不包括 1 月 2 日至 1 月 31 日或之间发生的访问;然后,如果适用,包括 2 月 1 日或之后发生的下一次访问。按时间顺序确定访问,每 31 天仅包括一次访问。
标签: sql stored-procedures views