我试图填补气象站数据表中的空白,问题是我的表没有空单元格用于数据丢失的地方,它只是从2023-04-07 10:30跳到2023-04-07 16:30。我原来有Excel文件,但我已导入此数据到Oracle SQL数据库,我正试图使用SQL开发人员填写的值。
这是我运行的SQL代码,
WITH DateSequence AS (
SELECT
TRUNC(MIN(Time), 'HH24') + (LEVEL - 1) / 48 AS generated_datetime
FROM
WeatherData
CONNECT BY
LEVEL <= (TRUNC(MAX(Time), 'HH24') - TRUNC(MIN(Time), 'HH24')) * 48 + 1
)
SELECT
ds.generated_datetime
FROM
DateSequence ds
LEFT JOIN
WeatherData wd -- Corrected alias here
ON
ds.generated_datetime = wd.Time -- Corrected alias here
WHERE
wd.Time IS NULL
ORDER BY
ds.generated_datetime;
有没有更简单的方法在Excel中使用PowerBI?或者是一个简单的SQL查询?
2条答案
按热度按时间gv8xihay1#
此查询将首先生成一个日期和时间序列,从数据集中的最小时间开始,到最大时间结束。然后,它将使用时间列作为连接条件,将此序列连接到数据集。对于序列中在数据集中没有对应行的任何行,温度和湿度列将设置为0。查询的结果将按时间列排序。
您还可以使用Power Query(在Excel或Power BI中)来填补数据中的空白。为此,您可以使用以下步骤:
在Power BI中通过单击“度量”窗格中的“新建度量”按钮创建新度量。在“公式编辑器”窗口中,输入以下公式:
1.单击“OK”按钮以保存测量。
1.在Power BI中创建一个新的表格或图表,并添加以下字段:
1.时间温度湿度
1.新度量(在步骤2中创建)
将度量聚合更改为“Average”。这将创建一个表格或图表,显示每个时间段的平均温度和湿度,即使数据中存在差距。
gev0vcfq2#
在Oracle中,使用
PARTITION
艾德OUTER JOIN
返回所有值,包括缺失值:其中,对于样本数据:
输出:
| 站点ID|时间|温度|风速|降雨|
| --|--|--|--|--|
| 1 |1970-01-01 07:00:00| 15 | 5 | 3 |
| 1 |1970-01-01 07:30:00| 16 | 4 | 0 |
| 1 |1970-01-01 08:00:00| * 空 | 空 | 空 *|
| 1 |1970-01-01 08:30:00| * 空 | 空 | 空 *|
| 1 |1970-01-01 09:00:00| 17 | 3 | 0 |
| 2 |1970-01-01 07:00:00| 14 | 10 | 10 |
| 2 |1970-01-01 07:30:00| * 空 | 空 | 空 *|
| 2 |1970-01-01 08:00:00| * 空 | 空 | 空 *|
| 2 |1970-01-01 08:30:00| 19 | 6 | 20 |
| 2 |1970-01-01 09:00:00| * 空 | 空 | 空 *|
| 3 |1970-01-01 07:00:00| * 空 | 空 | 空 *|
| 3 |1970-01-01 07:30:00| * 空 | 空 | 空 *|
| 3 |1970-01-01 08:00:00| 12 | 30 | 8 |
| 3 |1970-01-01 08:30:00| * 空 | 空 | 空 *|
| 3 |1970-01-01 09:00:00| * 空 | 空 | 空 *|
如果你想用
0
替换缺失的值,那么就用COALESCE
:其输出:
| 站点ID|时间|温度|风速|降雨|
| --|--|--|--|--|
| 1 |1970-01-01 07:00:00| 15 | 5 | 3 |
| 1 |1970-01-01 07:30:00| 16 | 4 | 0 |
| 1 |1970-01-01 08:00:00| 0 | 0 | 0 |
| 1 |1970-01-01 08:30:00| 0 | 0 | 0 |
| 1 |1970-01-01 09:00:00| 17 | 3 | 0 |
| 2 |1970-01-01 07:00:00| 14 | 10 | 10 |
| 2 |1970-01-01 07:30:00| 0 | 0 | 0 |
| 2 |1970-01-01 08:00:00| 0 | 0 | 0 |
| 2 |1970-01-01 08:30:00| 19 | 6 | 20 |
| 2 |1970-01-01 09:00:00| 0 | 0 | 0 |
| 3 |1970-01-01 07:00:00| 0 | 0 | 0 |
| 3 |1970-01-01 07:30:00| 0 | 0 | 0 |
| 3 |1970-01-01 08:00:00| 12 | 30 | 8 |
| 3 |1970-01-01 08:30:00| 0 | 0 | 0 |
| 3 |1970-01-01 09:00:00| 0 | 0 | 0 |
fiddle