【发布时间】:2021-05-19 15:49:01
【问题描述】:
我正在尝试从我筛选特定条件的现有表中创建一个新表。新表应删除原始表中每列缺少 50% 或更多行值的字段(列)(IS NULL),然后一些更基本的条件(如 A 列和 B 列的行值不能为空)。过滤的确切标准是:
- 删除缺少 50% 或更多列数据的所有列
- E 列必须介于 50 和 100 之间
- A 列和 B 列必须有一个行值
- F 列必须在 200 到 1000 之间
以下只是应用标准 1-4 后的表 A(原始表)和过滤后的表 B 的示例。
原表(A):
| Col_A | Col_B | Col_C | Col_D | Col_E | Col_F |
|---|---|---|---|---|---|
| xy | rs | NULL | NULL | 55 | 500 |
| xx | NULL | NULL | NULL | 65 | 845 |
| NULL | rt | x33 | NULL | 120 | 100 |
| xz | rz | NULL | NULL | 80 | 300 |
| xw | rp | NULL | NULL | 10 | 90 |
现有表中的新表 (B):
| Col_A | Col_B | Col_E | Col_F |
|---|---|---|---|
| xy | rs | 55 | 500 |
| xz | rz | 80 | 300 |
我的问题是我知道如何过滤条件 2、3 和 4 的数据,如下所示,但我不知道如何遍历每一列并检查该列是否有 50% 或更多的 NULL 值或缺失本例中的值。
CREATE TABLE B
AS SELECT * FROM A
WHERE (Col_A != "" AND Col_B != "")
AND (Col_E >= 50 AND Col_E <= 100)
AND (Col_F >= 200 AND Col_F <= 1000);
我找到了一种在单独的查询中检查我的 NULL 值的方法,如下所示:
SELECT
(COUNT(*) - COUNT(Col_A))/COUNT(*) AS NULL_A,
(COUNT(*) - COUNT(Col_B))/COUNT(*) AS NULL_B,
(COUNT(*) - COUNT(Col_C))/COUNT(*) AS NULL_C,
(COUNT(*) - COUNT(Col_D))/COUNT(*) AS NULL_D,
(COUNT(*) - COUNT(Col_E))/COUNT(*) AS NULL_E,
(COUNT(*) - COUNT(Col_F))/COUNT(*) AS NULL_F
FROM A;
此表的输出将告诉我每列中缺失值的数量。但是如何将它与我拥有的其他 WHERE 条件合并到我的原始查询中?这甚至可能吗?任何帮助将不胜感激。
【问题讨论】:
-
您的数据库标签看起来不兼容。请仅使用您真正使用的数据库进行标记。
-
@GordonLinoff 我删除了 sql-server 和 apache spark sql。我正在使用 zepplin notebook 处理 GCP,但只使用 ANSI sql。如果我的标签需要任何其他更改,请告诉我,谢谢!
-
必须动态构建 SQL 语句字符串以仅包含满足 50%+ 标准的字段。使用 If Then 或 CASE 结构做出决定。你能建立存储过程吗?不知道如何从聚合查询中提取百分比。在 Access VBA 中,我会使用 DLookup()。
标签: sql google-cloud-platform apache-zeppelin