sql - 以时间戳的日期值为条件的二进制指标
问题描述
在 SQL Server 中,如何创建一个新列,该列value > 0.5
在给定的一天只指示一次?
例如,高于 0.51 的值一天可能出现多次,但是在 24 小时内第一次出现高于 0.51 的值,我想指出这一点。在第二次出现高于 0.51 的值后,该指标必须为 0。
+---+-------------------+-----+
| id| date|value|
+---+-------------------+-----+
| J1|2016-10-01 11:45:30| 0.49|
| J1|2016-10-01 12:30:30| 0.51|
| J1|2016-10-01 13:20:00| 0.49|
| J1|2016-10-02 11:45:30| 0.44|
| J1|2016-10-03 11:30:30| 0.52|
| J1|2016-10-03 12:20:00| 0.49|
| J9|2016-10-06 08:35:00| 0.51|
| J9|2016-10-06 09:20:00| 0.44|
| J9|2016-10-07 08:35:00| 0.44|
| J9|2016-10-07 09:20:00| 0.53|
+---+-------------------+-----+
所需的数据框:
+---+-------------------+-----+----------+
| id| date|value| indicator|
+---+-------------------+-----+----------+
| J1|2016-10-01 11:45:30| 0.49| 0|
| J1|2016-10-01 12:30:30| 0.51| 1|
| J1|2016-10-01 13:20:00| 0.52| 0|
| J1|2016-10-01 14:45:30| 0.44| 0|
| J1|2016-10-02 11:30:30| 0.99| 1|
| J1|2016-10-02 12:20:00| 0.40| 0|
| J1|2016-10-02 08:35:00| 0.98| 0|
| J1|2016-10-02 09:20:00| 0.97| 0|
| J9|2016-10-07 08:35:00| 0.51| 1|
| J9|2016-10-07 09:20:00| 0.51| 0|
+---+-------------------+-----+----------+
解决方案
您可以使用窗口函数:
select t.*,
case when value > 0.5
and sum(case when value > 0.5 then 1 else 0 end) over(partition by id, convert(date, date) order by date) = 1
then 1 else 0 end as indicator
from mytable t
推荐阅读
- django - DRF - NestedSerializer 的 SerializerMethodField
- amazon-web-services - 如何创建 s3 存储桶子目录(无服务器)?
- javascript - 如何从 Okta 获取用户信息,而不是姓名、姓氏和电子邮件?
- python-3.x - 使用 python(使用 TLS 或 FTPS)为 Azure 应用程序安全部署 FTP
- javascript - 新 Google 站点菜单中的 Google 脚本:如何?
- powershell - 通过批量输入更改字符 NUL
- python - Python SSH 通过不同路径迭代
- graphics - 更快地绘制具有比例和 alpha 通道的 tbitmap
- javascript - javascript俄罗斯方块中的重启功能
- java - 如何在Java应用程序中的方法期间禁止按键?