mysql - SQL如何在值更改时检索第一行?

标签 mysql sql gaps-and-islands

我有一个包含 ID、日期和标志的表格。我想检索某年内标志已明确从 0 更改为 1 的第一条记录。

ID    DATE        FLAG
1    2019-01-31     0
1    2019-02-28     1
1    2019-03-31     1

2    2019-01-31     1
2    2019-02-28     1
2    2019-03-31     1
2    2019-04-30     0
2    2019-05-31     1

3    2019-01-31     0
3    2019-02-28     1
3    2019-03-31     0
3    2019-04-30     1

所以我的预期结果是 1 是 2019-01-31,2 将被排除,3 将是2019-02-28.

到目前为止,我的这个查询大部分都有效,但是当我进行 QA 时,该查询似乎不排除那些从 1 开始,切换到 0,然后返回到 1 的查询。

查询

SELECT t.ID,
    Date, 
    Flag
 FROM table t
WHERE Flag = '1' 
  AND t.Date > (SELECT MAX(t2.Date) FROM table t2 WHERE t2.ID = t.ID AND t2.Flag = '0' AND t2.Date BETWEEN '2019-01-01' AND '2019-12-31') 
AND t.Date BETWEEN '2019-01-01' AND '2019-12-31'
ORDER BY ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date);

任何帮助都会很棒,谢谢!

编辑:我添加了 SQLFiddle

最佳答案

使用lag()获取之前的flag然后聚合:

select id, min(date)
from (select *,
             lag(flag) over (partition by id, year(date) order by date) as prev_flag
      from temp
     ) t
where flag = 1 and prev_flag = 0
group by id, year(date);

SQL Fiddle

这将返回每年的结果。当然,您可以根据需要在子查询中按年份进行过滤。

关于mysql - SQL如何在值更改时检索第一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60609138/

相关文章:

php - 如何让 phpmailer 发送给正确的用户并限制某些用户的电子邮件数量?第2部分

sql - 何时对数据库设计进行非规范化

mysql - 重复值列表 SQL

SQL 日期范围查询 - 表比较

php - Zend_Db 和无缓冲查询

php - php中mysql的左连接/外键问题

mysql - 了解 SQL 中的元组语法

sql - 如何在不显式定义连接表的情况下在sequelize中创建三向连接表

sql - SQL中如何对连续记录进行分组

sql-server - 根据日期重叠对行进行分组