关于MySQL中的窗口,我有一个简短的问题

SELECT 
Client,
User,
Date,
Flag,
lag(Date) over (partition by Client,User order by Date asc) as last_date,
lag(Flag) over (partition by Client,User order by Date  asc) as last_flag,
case when Flag = 1 and last_flag = 1 then 1 else 0 end as consecutive
FROM db.tbl

此查询返回类似以下内容的内容.我正在try 计算每个用户的标志列为1的连续次数,如果他们有111most recently00111次,那么我们应该取最后三次出现1来确定他们具有连续的标志3次.

我需要提取连续旗帜的开始和结束日期.

我该如何着手做这件事,有人能帮我吗:)

enter image description here

如果我们使用11110000111的例子,那么我们应该只提取111,从而提取该客户的3个最近日期.因此,在下面的代码中,我们需要将10.01.2023作为第一个日期,将24.01.2023作为最后一个日期.连续计数应为3

enter image description here

输出:

enter image description here

推荐答案

使用聚合和字符串函数:

WITH cte AS (
  SELECT Client, User,
         GROUP_CONCAT(CASE WHEN Flag THEN Date END ORDER BY Date) AS dates,
         CHAR_LENGTH(SUBSTRING_INDEX(GROUP_CONCAT(Flag ORDER BY Date SEPARATOR ''), '0', '-1')) AS consecutive
  FROM tablename
  GROUP BY Client, User
)
SELECT Client, User,
       NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(dates, ',', -consecutive), ',', 1), '') AS first_date,
       CASE WHEN consecutive > 0 THEN SUBSTRING_INDEX(dates, ',', -1) END AS last_date,
       consecutive 
FROM cte;

另一种使用窗口函数和条件聚合的解决方案:

WITH 
  cte1 AS (SELECT *, SUM(NOT Flag) OVER (PARTITION BY Client, User ORDER BY Date) AS grp FROM tablename),
  cte2 AS (SELECT *, MAX(grp) OVER (PARTITION BY Client, User) AS max_grp FROM cte1)
SELECT Client, User,
       MIN(CASE WHEN Flag THEN Date END) AS first_date,
       MAX(CASE WHEN Flag THEN Date END) AS last_date,
       SUM(Flag) AS consecutive
FROM cte2 
WHERE grp = max_grp
GROUP BY Client, User;

See the demo.

Mysql相关问答推荐

—符号在哪里条件""

MySQL连接序列

MySQL::JSON列的添加使SELECT查询非性能(当需要临时表时)

Python MySQL-无法从数据库中删除行

不分组寻呼

如何从MySQL数据库中提取入职第一个月的工作天数?

如何查询一行

MySQL Procedure 变量在 count(*) 上接收 null

如何查询由另一个查询创建的表?

如何 Select 具有最新的 2 个日期字段的行?

使用 SET 变量进行 MySQL 查询

使用 DISTINCT 时无法从数据库中查询所有数据

我在查询中没有得到正确的结果

Select 多列但仅按 1 列分组

如何使用 sequelize 将复合主键放在连接表中?

phpMyAdmin - 无法连接 - 无效设置 - 自从我添加了 root 密码 - 被锁定

第 1 行的 CSV 输入中的列数无效错误

在 MySQL 中的子查询上使用 GROUP_CONCAT

如何通过一个语句描述数据库中的所有表?

MySQL 错误 2014 的原因在其他无缓冲查询处于活动状态时无法执行查询