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);
这将返回每年的结果。当然,您可以根据需要在子查询中按年份进行过滤。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。