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

webabcd 阅读:98 2024-12-31 21:38:35 评论:0

我有一个包含 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
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号