sql - 根据条件将一列转换为两列
问题描述
我有一张像这样的表:
TagName DateTime value
HA_06_ON 2020-07-07 08:52:14 1
HA_06_ON 2020-07-07 09:01:42 0
HA_06_ON 2020-07-07 09:02:17 1
HA_06_ON 2020-07-07 09:32:55 0
HA_06_ON 2020-07-07 09:33:21 1
HA_06_ON 2020-07-07 09:35:02 0
HA_06_ON 2020-07-07 09:35:27 1
HA_06_ON 2020-07-07 09:35:44 0
HA_06_ON 2020-07-07 10:10:32 1
HA_06_ON 2020-07-07 10:10:40 0
我想将此表转换为此基于值(值 = 1 ==> startTime,值 = 0 ==> EndTime)。
TagName StartTime EndTime
HA_06_ON 2020-07-07 08:52:14 2020-07-07 09:01:42
HA_06_ON 2020-07-07 09:02:17 2020-07-07 09:32:55
....
我尝试在 select 语句上使用 case 但在每一列上都返回 null 像这样
TagName StartTime EndTime
HA_06_ON 2020-07-07 08:57:07 NULL
HA_06_ON NULL 2020-07-07 09:01:42
HA_06_ON 2020-07-07 09:02:17 NULL
HA_06_ON NULL 2020-07-07 09:32:55
HA_06_ON 2020-07-07 09:33:21 NULL
HA_06_ON NULL 2020-07-07 09:35:02
解决方案
由于您在这里没有分组列,我们必须做出一个假设:我们可以处理您的数据,假设如果我们按日期排序,1 和 0 将交替出现。否则就没有解决方案,因为我们不知道如何将 1 与 0 关联起来。
鉴于我们可以假设这种排序,我们可以使用lag()
orlead()
来执行此操作。请注意,这假设您从 1 开始,并且每个 1 都有对应的 0。如果最后一个 1 没有对应的 0,则该行的 EndTime 将为空。
select u.TagName,
u.StartTime,
u.EndTime
from (
select TagName,
StartTime = [DateTime] ,
EndTime = lead([DateTime], 1) over
(
partition by TagName
order by [Datetime] asc
),
value
from t
) u
where u.value = 1
推荐阅读
- javascript - Firestore 文档侦听器不从服务器返回当前值
- android - 为“com.android.build.gradle.AppPlugin@1f27b383”读取“META-INF/MANIFEST.MF”时出错
- mongodb - 将 MongoDB Secondary 变为独立实例
- angular - Pristine 不更新表单内列表框中的更改
- powershell - 导入-csv 多个文件
- node.js - /npm/bin/npm-cli.js:在 Azure 应用服务 - 节点应用上找不到
- flutter - 在选定的 TextButton 之间进行动画处理
- java - 使用 BufferedReader 接收 TCP 数据包时超时
- python - 根据另一列对熊猫数据框应用不同的功能
- java - 运行 react-native run-android 时出现 React Native compileDebugJavaWithJavac 错误