我有以下数据(fiddle),

id datec event
1 2022-09-19 12:16:38 EVENTA
2 2022-09-19 12:16:38 A
3 2022-09-19 12:21:08 B
4 2022-09-19 12:21:12 EVENTD
5 2022-09-19 12:25:18 C
6 2022-09-19 12:25:18 D
7 2022-09-19 12:25:28 E
8 2022-09-19 12:25:29 F
9 2022-09-19 12:25:38 EVENTA
10 2022-09-19 12:25:39 G
11 2022-09-19 12:25:40 H
12 2022-09-19 12:25:48 I
13 2022-09-19 12:27:18 EVENTD
14 2022-09-19 12:29:08 J

我不知道如何在其他两个值之间进行 Select ,但要按特定的顺序进行 Select .只应按该顺序返回事件between EVENTA and EVENTD.

因此,结果应该是ID为14913的行

try 执行类似下面的操作,但它给了我id 1、4、9和13,省略了它们之间的内容.

SELECT id, datec, event 
FROM table1 
WHERE event BETWEEN 'EVENTA' AND 'EVENTD';

然后我试着用这个,

SELECT id, datec, event 
FROM table1 
WHERE (id BETWEEN (SELECT id 
                   FROM table1 
                   WHERE event BETWEEN 'EVENTA' AND 'EVENTD' 
                   LIMIT 1) 
              AND (SELECT id 
                   FROM table1 
                   WHERE event BETWEEN 'EVENTA' AND 'EVENTD' 
                   LIMIT 1,1)) 
   OR (id BETWEEN (SELECT id 
                   FROM table1 
                   WHERE event BETWEEN 'EVENTA' AND 'EVENTD' 
                   LIMIT 2,1) 
              AND (SELECT id 
                   FROM table1 
                   WHERE event BETWEEN 'EVENTA' AND 'EVENTD' LIMIT 3,1));

它给出了结果,但我的表中有很多行.

能不能请谁来指导我如何把这个重复到最后,因为我确信有办法做到这一点,但我想不出该怎么做?

向您致敬,

皮埃尔

推荐答案

这里有一种方法:

  • 计算武装事件和解除武装事件的运行计数,按日期排序
  • 通过对解除武装事件的数量进行排序,计算每个武装事件计数的记录排名顺序

此时,您应该注意到,当ARM_EVENT分区中还没有EventD时,我们生成的排名值采用值0.当找到第一个EventD时,它的值为1,直到连续的EventD.

因此,当该等级值为0或1并且事件恰好为"EventD"时,您只需在WHERE子句中进行相应的筛选.

WITH cte AS (
    SELECT *, SUM(`event`='EVENTA') OVER(ORDER BY datec, id) AS armed_events,
              SUM(`event`='EVENTD') OVER(ORDER BY datec, id) AS disarmed_events
    FROM Table1
), cte2 AS (
    SELECT *, DENSE_RANK() OVER(PARTITION BY armed_events ORDER BY disarmed_events) -1 AS rn
    FROM cte
)
SELECT `id`, `datec`, `event` 
FROM cte2
WHERE rn = 0 OR (rn = 1 AND `event` = 'EVENTD')
ORDER BY id

Output:

id datec event
1 2022-09-19 12:16:38 EVENTA
2 2022-09-19 12:16:38 A
3 2022-09-19 12:21:08 B
4 2022-09-19 12:21:12 EVENTD
9 2022-09-19 12:25:38 EVENTA
10 2022-09-19 12:25:39 G
11 2022-09-19 12:25:40 H
12 2022-09-19 12:25:48 I
13 2022-09-19 12:27:18 EVENTD

查看演示here.

注:最后ORDER BY条不是必须的.它在那里只是为了可视化的目的.

Mysql相关问答推荐

SQL - Select 复合主键,条件为其中一个主键

为什么歌曲详细信息未显示在 Liked.handlebars 视图中?

使用 awk 重写 maxscale 过滤器

为什么Mysql会根据查询参数改变查询执行计划?

将 JSON 类型的列与特定字符串值进行比较

模拟Mysql Cursor类的fetchone()方法,并将其返回值设置为None

有没有比使用 MySQL 计划事件更好的方法来更新我的数据库表中的列?

如何根据 R 中的价格范围将数据从一列复制到新列?

MySQL Join 查询位置从订单

此更新查询是否有任何可能的重写选项?

按年份范围 SQL 查询分组

MySQL过滤食谱上的多对多 - 成分表

使用 ON DUPLICATE KEY 将列增加一定数量 MySQL NodeJS

更改整数时间到日期格式 MM/DD/YY,如 python 中的 datetime.fromtimestamp

减少mysql中的值但不是负数

MySQL 工作台与 phpMyAdmin

Facebook user_id:big_int、int 还是 string?

默认为空字符串的列

MySQL行格式:固定和动态之间的区别?

MySQL连接查询使用like?