首页 > 解决方案 > 查看 SQL 字段是否随着时间的推移将某些用户的 False 更改为 True 的最简单方法?

问题描述

我有一个包含用户、日期和 IS_MEMBER 的表。

某些用户从 IS_MEMBER False -> True。

我想创建一个新字段来识别这些用户(将 BECAME_MEMBER 设置为 True)。

对于停止成为成员、已经是成员或任何其他行为的用户,我不希望这个新字段设置为 True,而不仅仅是在任何日期成为并保持成员身份。

简化示例,尽管实际表要大得多:

Users|Date|IS_MEMBER
1111|2020-01-01|FALSE
1111|2020-07-10|FALSE
1111|2020-11-20|FALSE
2222|2020-01-01|FALSE
2222|2020-07-10|TRUE
2222|2020-11-20|FALSE
3333|2020-01-01|FALSE
3333|2020-07-10|TRUE
3333|2020-11-20|TRUE
4444|2020-01-01|TRUE
4444|2020-07-10|TRUE
4444|2020-11-20|TRUE

期望的结果:

Users|Date|IS_MEMBER|BECAME_MEMBER
1111|2020-01-01|FALSE|FALSE
1111|2020-07-10|FALSE|FALSE
1111|2020-11-20|FALSE|FALSE
2222|2020-01-01|FALSE|FALSE
2222|2020-07-10|TRUE|FALSE
2222|2020-11-20|FALSE|FALSE
3333|2020-01-01|FALSE|TRUE
3333|2020-07-10|TRUE|TRUE
3333|2020-11-20|TRUE|TRUE
4444|2020-01-01|TRUE|FALSE
4444|2020-07-10|TRUE|FALSE
4444|2020-11-20|TRUE|FALSE

为此创建 SQL 语句的最佳方法是什么?我正在使用 SnowSQL,但任何 RDMS 语言都可以作为答案。

标签: sqlsnowflake-cloud-data-platform

解决方案


您可以使用窗口函数来标记第一个成员资格:

select t.*,
    (is_member and (min(date) over(partition by users, member) = date)) as became_member
from mytable t

这假设它is_memberboolean数据类型。


推荐阅读