sql - 查看 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 语言都可以作为答案。
解决方案
您可以使用窗口函数来标记第一个成员资格:
select t.*,
(is_member and (min(date) over(partition by users, member) = date)) as became_member
from mytable t
这假设它is_member
是boolean
数据类型。
推荐阅读
- asp.net-core - Asp.net 核心 Kestrel 服务器和 CLI
- java - 信任 SSL 证书:Commons HTTP 客户端如何比标准 Java 更信任?
- lua - 每个 taglist 项目的不同背景颜色 AwesomeWM
- r - 为什么我绘制随时间增长的函数不起作用?
- c# - 压缩文件时出现异常
- javascript - 将类添加到模板克隆中的元素(Google 脚本)
- json - Shopify 中返回了错误的 JSON 数据
- azure - Azure 翻译 API - 缓存
- regex - 用编号分割bash中的长行
- anylogic - 是否可以以编程方式将代理作为资源添加到资源池中?