sql - 在 postgres 中将结果集从宽表重塑为长表并改进查询
问题描述
我编写了以下查询来获取表中所有列的缺失值数量。但这会在一个宽形表中返回结果集:
1)我需要以长格式重新调整结果集。
2)是否可以改进查询以编写更简单的查询?
查询:
-- Variable to save the row count from the table
WITH total_rows AS
(
SELECT COUNT(*) AS rows
FROM table_name
)
-- Query to join subqueries (wide table format)
SELECT
*
FROM
-- Subquery1
(SELECT
(SELECT rows FROM total_rows) - COUNT(colum1) AS missing_colum1 -- counts all values except nulls
FROM table_name
) AS missing_values_colum1,
-- Subquery2
(SELECT
(SELECT rows FROM total_rows) - COUNT(colum2) AS missing_colum2
FROM table_name
) AS missing_values_colum2,
-- Subquery3
(SELECT
(SELECT rows FROM total_rows) - COUNT(colum3) AS missing_colum3
FROM table_name
) AS missing_values_colum3,
-- Subquery4
(SELECT
(SELECT rows FROM total_rows) - COUNT(colum4) AS missing_colum4
FROM table_name
) AS missing_values_colum4
;
任何提示都会有所帮助。先感谢您。
解决方案
我不完全清楚你想要实现什么。
但对于初学者来说,您现有的查询可以简化为:
select count(*) as total_rows,
count(*) - count(column1) as missing_column1,
count(*) - count(column2) as missing_column2,
count(*) - count(column3) as missing_column3,
count(*) - count(column3) as missing_column4
from table_name
如果您担心:count(*)
只会评估一次,而不是五次。
如果您希望每列的数字作为行(“长格式”?)而不是列(“宽格式”),您可以从上面的结果中取消透视:
with totals as (
select count(*) as total_rows,
count(*) - count(column1) as missing_column1,
count(*) - count(column2) as missing_column2,
count(*) - count(column3) as missing_column3,
count(*) - count(column3) as missing_column4
from table_name
)
select t.total_rows, m.col_name, m.num_missing
from totals t
cross join lateral (
values ('column1', missing_column1),
('column2', missing_column2),
('column3', missing_column3),
('column4', missing_column4)
) as m(col_name, missing);
推荐阅读
- javascript - 为什么 Ramda 源码有不止一个 curry 函数,Redux 也是 compose 的?
- rundeck - 远程执行的 Rundeck 3.x 错误 - 失败:AuthenticationFailure:连接到节点的身份验证失败。无法验证
- javascript - 预加载图像 JavaScript
- reactjs - npx create-react-app my-app 在 mac 上不起作用:堆栈错误:缺少脚本:开始
- java - 在 Java 中使用递归解决 leetcode 上的回文问题
- java - 无法在 Windows 上触发提交 jar
- cryptography - 环签名实现起来复杂吗?以后添加它们会导致大规模重写代码吗?
- karate - 在 karate-config.js 中读取 gradle 命令行参数的问题
- julia - 如何通过 Julia 在类似 awk 的方法中对目录中的一些文件长度求和?
- javascript - 将预先格式化的文本更改为 javascript 对象