当前位置: 首页 > 面试题库 >

如何在每个列上执行相同的汇总而不列出列?

阴迪
2023-03-14
问题内容

我有一个带有 N 列的表。让我们给他们打电话c1c2c3c4,… cN。在多行中,我想为COUNTDISTINCT(cX)[1,N]中的每个X获得单个行。

c1 | c2 | ... | cn
0  | 4  | ... | 1

有没有一种方法(在存储过程中)而无需手动将每个列名写入查询中呢?

我们遇到了一个问题,即应用程序服务器中的错误意味着我们在以后插入垃圾时重写了良好的列值。为了解决这个问题,我存储了信息日志结构,其中每一行代表一个逻辑UPDATE查询。然后,在给出记录已完成的信号时,我可以确定是否有任何值(错误)被覆盖。

多行中的单个正确记录的示例:每列最多有一个值。

| id | initialize_time | start_time | end_time |
| 1  | 12:00am         | NULL       | NULL     |
| 1  | 12:00am         | 1:00pm     | NULL     |
| 1  | 12:00am         | NULL       | 2:00pm   |

Reconciled row:
| 1  | 12:00am         | 1:00pm     | 2:00pm   |

我要检测的不可调和记录的示例

| id | initialize_time | start_time | end_time |
| 1  | 12:00am         | NULL       | NULL     |
| 1  | 12:00am         | 1:00pm     | NULL     |
| 1  | 9:00am          | 1:00pm     | 2:00pm   |   -- New initialize time => irreconcilable!

问题答案:

为此,您需要 动态SQL,这意味着您必须创建一个函数或运行一个DO命令。由于您不能直接从后者返回值,因此使用 plpgsql函数 是:

CREATE OR REPLACE function f_count_all(_tbl text
                           , OUT columns text[], OUT counts bigint[])
  RETURNS record LANGUAGE plpgsql AS
$func$
BEGIN

EXECUTE (
    SELECT 'SELECT
     ARRAY[' || string_agg('''' || quote_ident(attname) || '''', ', ') || '], 
     ARRAY[' || string_agg('count(' || quote_ident(attname) || ')', ', ') || ']
    FROM ' || _tbl
    FROM   pg_attribute
    WHERE  attrelid = _tbl::regclass
    AND    attnum  >= 1           -- exclude tableoid & friends (neg. attnum)
    AND    attisdropped is FALSE  -- exclude deleted columns
    GROUP  BY attrelid
    )
INTO columns, counts;

END
$func$;

称呼:

SELECT * FROM f_count_all('myschema.mytable');

返回值:

columns       | counts
--------------+--------
{c1, c2, c3,} | {17 1,0}


 类似资料:
  • 我有一个这样的数字列表: 如何以优雅的方式总结每个N(让我们假设2)个元素并将列表转换为: 编辑:我想出了以下解决方案: 它是有效的,但我仍然在寻找一个更易读、更简单的方法。

  • 问题内容: 在MySQL中,我有两个表: 和 我需要对表(等式7)和表(等式3)中的列求和,并将结果作为总数量。 当我做 我得到了笛卡尔积(20),但是我需要的正确答案是10。如何更改此查询以获得正确的结果? 问题答案:

  • 问题内容: 假设我的表包含以下内容: 每次通过while循环。我想获取价格值的总和,但ID中的每个不同值仅获取一次 因此,以上述示例为例,我将得到类似以下内容的信息: 补充一下,我可能偶然发现了类似的帖子。问题是其他职位使用Oracle,另一方面我正在使用MySQL。 问题答案: 你需要和

  • 问题内容: 我有这样的结构: 我想使用内置方法(在一行中)对整数()求和。 有任何想法吗? 问题答案: 会工作。

  • 问题内容: 我如何使用JPA条件API执行以下操作: 使用CriteriaBuilder.countDistinct在一个列/路径上执行此操作很简单,但是如何在两个路径/列上执行此操作? 问题答案: 这是一个较晚的答案:-)尽管我不确定情况是否有所改变。 最近,我遇到了非常相同的需求,并使用concat解决了该需求,即通过将列连接为 伪列 ,然后将其连接到 伪列 上。 但是我不能使用,因为它生成了

  • 我知道已经有很多相关的问题了,但是没有一个回答了我的特殊需求。 我想在一个有50列的表上使用dplyr“summary”,我需要对这些列应用不同的摘要函数。 “SUMMARE_all”和“SUMMARY_at”似乎都有缺点,即不可能将不同的函数应用于变量的不同子组。 例如,让我们假设iris数据集有50列,所以我们不想按名称寻址列。我需要前两列的总和、第三列的平均值以及所有剩余列的第一个值(在gr