sql - Multiple actions in a certain time
问题描述
I need to create a list of only (Client_ID) and (Client first Purchase_date).
However, there’s a Client Criteria: return only the clients who have made their second purchase within max 50 days of their first purchase_date.
Client_id | Purchase_date | purchase_type_id | Billing_ID
---------------------------------------------------------
01 | 05-Jan-19 | 1 | 010
01 | 18-Jan-19 | 2 | 018
02 | 05-Feb-19 | 1 | 021
03 | 18-Apr-19 | 3 | 029
03 | 01-Aug-19 | 3 | 030
04 | 05-Aug-19 | 2 | 049
05 | 05-Aug-19 | 2 | 059
06 | 05-Aug-19 | 1 | 060
*Purchase Type ID: (1) For (New Client), (2) for (Repeat Client), (3) for (Same Item like the previous purchase).
According to this, the query must only contain Client_id = 01
解决方案
您可以使用lead()
窗口功能:
SELECT
"Client_id",
MIN("Purchase_date")
FROM (
SELECT
*,
lead("Purchase_date") OVER (PARTITION BY "Client_id" ORDER BY "Purchase_date")
- "Purchase_date" AS diff
FROM
mytable
) s
WHERE diff <= 50
GROUP BY "Client_id"
lead("Purchase_date")
为您提供条款中指定的组内的下一个购买日期PARTITION BY
(在您的情况下为Client_id
)- 您可以用它来计算与当前购买日期的差异,从而为您提供天数
- 过滤具有不同
<= 50
天数的所有值 - 如果在此范围内有多个购买,您可以通过分组给出最小日期
推荐阅读
- java - kubernetes 上的 Java APM 代理出错:无法处理 METRICS 类型的事件并出现此错误:/ 为零
- lex - 在规则中使用行尾匹配模式“$”时,Lex (flex) 会生成危险的尾随上下文警告
- custom-controls - Failed to set (titleText) user defined inspected property
- java - Kotlin to Java, Bottom Navigation Bar
- android - Android Google Billing Client - onSkuDetailsResponse Always Empty List
- python - python的正则表达式:如何在单词之间提取字符串?
- javascript - 如果我不 removeEventListener (JavaScript) 会发生什么?
- vba - 指定发件人电子邮件
- android - 如何在 RecyclerView 中创建粘性标题,如所附图片?
- python-3.x - python xlsxwriter 从单元格中提取值