sql - GROUP BY 和 NULL (SQL / BigQuery) 的问题
问题描述
我有一些不好的数据需要进行一些转换并且正在努力做。
下面是示例数据和所需的输出。
我希望的是,如果 PUNCHIN 为 NULL,但该 EmployeeNum 和 APPLY_DATE 有另一个 PUNCHIN 值,然后使用另一个值。否则,使用 SHIFTSTARTTIME。PUNCHOUT 和 SHIFTENDTIME 也是如此。
最初我想使用 MIN(PUNCHIN) 和 GROUP BY,但 EmployeeNum 和 APPLY_DATE 可以有多个条目,如 EmployeeNum 456 所示
| EmployeeNum | APPLY_DATE | PUNCHIN | PUNCHOUT | SHIFTSTARTTIME | SHIFTENDTIME |
+-------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| 123 | 2019-06-29T00:00:00 | null | 2019-06-30T00:55:00 | 2019-06-29T17:00:00 | 2019-06-30T01:00:00 |
| 123 | 2019-06-29T00:00:00 | 2019-06-29T16:54:00 | null | 2019-06-29T17:00:00 | 2019-06-30T01:00:00 |
| 456 | 2019-12-09T00:00:00 | 2019-12-09T16:15:00 | 2019-12-09T21:15:00 | 2019-12-09T16:15:00 | 2019-12-09T21:15:00 |
| 456 | 2019-12-09T00:00:00 | 2019-12-09T22:00:00 | 2019-12-10T02:00:00 | 2019-12-09T22:00:00 | 2019-12-10T02:00:00 |
| 789 | 2019-12-22T00:00:00 | null | null | 2019-12-09T22:00:00 | 2019-12-10T02:00:00 |
+-------------+---------------------+---------------------+---------------------+---------------------+---------------------+ ```
And the output I'm looking for is:
```+-------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| EmployeeNum | APPLY_DATE | PUNCHIN | PUNCHOUT | SHIFTSTART | SHIFTEND |
+-------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| 123 | 2019-06-29T00:00:00 | 2019-06-29T16:54:00 | 2019-06-30T00:55:00 | 2019-06-29T17:00:00 | 2019-06-30T01:00:00 |
| 456 | 2019-12-09T00:00:00 | 2019-12-09T16:15:00 | 2019-12-09T21:15:00 | 2019-12-09T16:15:00 | 2019-12-09T21:15:00 |
| 456 | 2019-12-09T00:00:00 | 2019-12-09T22:00:00 | 2019-12-10T02:00:00 | 2019-12-09T22:00:00 | 2019-12-10T02:00:00 |
| 789 | 2019-12-22T00:00:00 | 2019-12-09T22:00:00 | 2019-12-10T02:00:00 | 2019-12-09T22:00:00 | 2019-12-10T02:00:00 |
+-------------+---------------------+---------------------+---------------------+---------------------+---------------------+```
解决方案
嗯。. . 我认为这可以满足您的要求:
select distinct employeenum, apply_date,
coalesce(punchin, max(punchin) over (partition by employeenum, apply_date), apply_date),
coalesce(punchout, max(punchout) over (partition by employeenum, apply_date), apply_date)
from t;
推荐阅读
- c# - 在回发更改中继器项目后,RepeaterCommandEventArgs 不正确
- r - 使用不同的比例绘制两个热图
- printing - OCR 字体间距问题
- gradle - 从 Gradle 中的插件中排除依赖项?
- c# - 无法通过在 C# 中调用 powershell 来安装 NuGet 提供程序
- python - 如何测量在二进制掩码中重叠的两个质心点之间的距离?
- security - 将云功能暴露给公众对我来说有多危险?
- javascript - 使用 javaScript 将元素添加到 DOm 结构中
- javascript - 比较json中的所有对象
- windows - 如果我们通过 Windows Insider 程序更新 Windows 11。我们可以再次安装 Windows 11 稳定版吗?