MySQL-模拟具有多个先前行的滞后(不仅仅是一个)

时间:2019-02-04 08:10:14

标签: mysql sql window-functions

经过几个小时的努力,模拟了延迟(我在MySQL 5.6上没有升级选项),发现了两个功能问题,我来这里寻求一点帮助,现在我在这里完全迷路了。 / p>

经过长时间的处理后,我在存储过程中得到一个临时表,该表具有通过userid和purchaseDate(示例)的以下数据顺序:

示例通过以下方式获取:

SELECT 
purchaseId
,userId
,purchaseDate 
FROM tempPurchases
WHERE userId > 69
ORDER BY userId, purchaseDate;


+------------+--------+--------------+
| purchaseId | userId | purchaseDate |
+------------+--------+--------------+
|       2074 |     70 | 2018-11-12   |
|       2072 |     70 | 2018-11-30   |
|       2108 |     71 | 2018-01-23   |
|       2114 |     71 | 2018-02-27   |
|       2130 |     71 | 2018-03-07   |
|       2115 |     71 | 2018-04-17   |
|       2105 |     71 | 2018-11-12   |
|       2112 |     71 | 2018-11-30   |
|       2145 |     72 | 2018-01-21   |
|       2141 |     72 | 2018-01-23   |
|       2136 |     72 | 2018-02-01   |
|       2148 |     72 | 2018-03-02   |
|       2158 |     72 | 2018-06-06   |
|       2137 |     72 | 2018-07-04   |
|       2139 |     72 | 2018-07-11   |
|       2153 |     72 | 2018-10-18   |
|       2135 |     72 | 2018-10-25   |
|       2157 |     72 | 2018-11-12   |
|       2147 |     72 | 2018-12-30   |
|       2184 |     73 | 2018-02-21   |
|       2166 |     73 | 2018-03-14   |
|       2176 |     73 | 2018-05-12   |
|       2186 |     73 | 2018-07-09   |
|       2173 |     73 | 2018-08-25   |
|       2162 |     73 | 2018-11-12   |
|       2165 |     73 | 2018-11-30   |
+------------+--------+--------------+

该规范是在30天内通过购买进行“奖励”(我使用TIMESTAMPDIFF(DAYS)并通过滞后来计算一个日期与上一个日期之间的天数差。这里的问题是,奖金也与多个先前行,而不仅仅是上面的行。(A列的逻辑)

例如,在下一个示例中,对于用户ID 72,purchaseId 2136与2141匹配,但也与2145匹配,这当然是可变的,例如今天进行10次购买和昨天进行20次购买的人。

所以期望的结果是:

+------------+--------+--------------+-----------+------------+--------------------------+
| purchaseId | userId | purchaseDate | days diff | A (streak) | B (streak without reset) |
+------------+--------+--------------+-----------+------------+--------------------------+
|       2074 |     70 | 2018-11-12   |         0 |          0 |                        0 |
|       2072 |     70 | 2018-11-30   |        18 |          1 |                        1 |
|       2108 |     71 | 2018-01-23   |         0 |          0 |                        0 |
|       2114 |     71 | 2018-02-27   |        35 |          0 |                        0 |
|       2130 |     71 | 2018-03-07   |         8 |          1 |                        1 |
|       2115 |     71 | 2018-04-17   |        41 |          0 |                        0 |
|       2105 |     71 | 2018-11-12   |       209 |          0 |                        0 |
|       2112 |     71 | 2018-11-30   |        18 |          1 |                        1 |
|       2145 |     72 | 2018-01-21   |         0 |          0 |                        0 |
|       2141 |     72 | 2018-01-23   |         2 |          1 |                        1 |
|       2136 |     72 | 2018-02-01   |         9 |          2 |                        2 |
|       2148 |     72 | 2018-03-02   |        29 |          1 |                        3 |
|       2158 |     72 | 2018-06-06   |        96 |          0 |                        0 |
|       2137 |     72 | 2018-07-04   |        28 |          1 |                        1 |
|       2139 |     72 | 2018-07-11   |         7 |          1 |                        2 |
|       2153 |     72 | 2018-10-18   |        99 |          0 |                        0 |
|       2135 |     72 | 2018-10-25   |         7 |          1 |                        1 |
|       2157 |     72 | 2018-11-12   |        18 |          2 |                        2 |
|       2147 |     72 | 2018-12-30   |        48 |          0 |                        0 |
|       2184 |     73 | 2018-02-21   |         0 |          0 |                        0 |
|       2166 |     73 | 2018-03-14   |        21 |          1 |                        1 |
|       2176 |     73 | 2018-05-12   |        59 |          0 |                        0 |
|       2186 |     73 | 2018-07-09   |        58 |          0 |                        0 |
|       2173 |     73 | 2018-08-25   |        47 |          0 |                        0 |
|       2162 |     73 | 2018-11-12   |        79 |          0 |                        0 |
|       2165 |     73 | 2018-11-30   |        18 |          1 |                        1 |
+------------+--------+--------------+-----------+------------+--------------------------+

由于多次联接/左联接和滞后模拟而完全丢失,任何提示,评论或答案都会很精确。请不要对此发表评论或提出任何疑问。

问题: 我如何获得A条纹的计算结果,同时注意上面几行的“滞后”? 我的实际方法是使用游标,但暂时无法使用。

更新:

预期的结果是获得“奖金连胜”,同时注意上述同一用户ID的行。例如:

userId 72在01 / jan(第一行值为0)上进行了购买(购买1)。然后再次(购买2)为10 / jan,因此少于30天:1分(10天)。同样在15/01(购买3),所以购买2(5天)之间的差异为1点,购买1(15天)之间的差异为1点。总奖金:3(0 +1 +(1 + 1))

1 个答案:

答案 0 :(得分:1)

我相信就这么简单,select中的子查询计算过去30天内的购买次数:

SELECT t.*, (
    SELECT COUNT(*)
    FROM t AS x
    WHERE userId = t.userId 
    AND purchaseDate <  t.purchaseDate
    AND purchaseDate >= t.purchaseDate - INTERVAL 30 DAY
) AS purchases_within_30days
FROM t