如何在标题中带有条件的特定行之后结束窗口函数SQL

问题描述 投票:0回答:1

大家!

我有一张桌子,在它之前我为每次购买附加了电话号码。像这样:

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”字样的行结束

sql window-functions
1个回答
0
投票

我们可以使用窗口函数

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

mysql 8.0 演示

© www.soinside.com 2019 - 2024. All rights reserved.