大家!
我有一张桌子,在它之前我为每次购买附加了电话号码。像这样:
id | 日期 | 时间 | 标题 | 响 |
---|---|---|---|---|
1 | 2023-03-03 | 2023-03-03 10:00 | A | 1 |
1 | 2023-03-03 | 2023-03-03 10:10 | B | 2 |
1 | 2023-03-03 | 2023-03-03 10:20 | 买C | 3 |
1 | 2023-03-03 | 2023-03-03 10:20 | D | 4 |
1 | 2023-03-03 | 2023-03-03 10:30 | E | 5 |
1 | 2023-03-03 | 2023-03-03 10:40 | 买F | 6 |
1 | 2023-03-03 | 2023-03-03 10:50 | G | 7 |
2 | 2023-03-03 | 2023-03-03 12:00 | A_1 | 1 |
2 | 2023-03-03 | 2023-03-03 12:20 | 购买B_1 | 2 |
2 | 2023-03-03 | 2023-03-03 12:20 | C_1 | 3 |
但是我会在标题为“BUY”的某一行之后结束窗口函数。 我尝试使用:
RANK() OVER (PARTITION BY id ORDER BY time ASC RESET WHEN title LIKE '%BUY%')
但这不起作用。结果如下:
id | 日期 | 时间 | 标题 | 响 |
---|---|---|---|---|
1 | 2023-03-03 | 2023-03-03 10:00 | A | 1 |
1 | 2023-03-03 | 2023-03-03 10:10 | B | 2 |
1 | 2023-03-03 | 2023-03-03 10:20 | 买C | 3 |
2 | 2023-03-03 | 2023-03-03 12:00 | A_1 | 1 |
2 | 2023-03-03 | 2023-03-03 12:20 | 购买B_1 | 2 |
第一次全部在带有“BUY”字样的行结束
我们可以使用窗口函数
SUM()
提供的运行总计来识别标题中包含“BUY”的行的首次出现。随后,我们可以将此数据集与您的表连接,条件是“rang”值应低于第一行“BUY”的值。
SELECT t.*
FROM mytable t
INNER JOIN (
SELECT *, SUM(CASE WHEN title LIKE '%BUY%' THEN 1 ELSE 0 END) OVER (PARTITION BY id ORDER BY time) AS sm
FROM mytable
) AS s ON s.id = t.id AND t.rang <= s.rang
WHERE s.sm = 1 AND s.title LIKE '%BUY%';
结果:
id date time title rang
1 2023-03-03 2023-03-03 10:00:00 A 1
1 2023-03-03 2023-03-03 10:10:00 B 2
1 2023-03-03 2023-03-03 10:20:00 BUY C 3
2 2023-03-03 2023-03-03 12:00:00 A_1 1
2 2023-03-03 2023-03-03 12:20:00 BUY B_1 2