创建一个包含 2 行值的报告,每行值都来自一个单独的 SELECT 语句

如何解决创建一个包含 2 行值的报告,每行值都来自一个单独的 SELECT 语句

我有一个报告(如果您关心的话,使用 Blazer)显示这样的数据,即 jobs 表中最近更新或创建的行的数据:

5 Minutes | 1 Hour | 1 Day | Total
----------------------------------
        0        0     367  30,989

SQL 看起来像这样:

SELECT
    (SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '5 minutes' AND NOW()
    ) as "5 Minutes",(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '1 Hours' AND NOW()
    ) as "1 Hour",(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '1 Day' AND NOW()
    ) as "1 Day",(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    ) as "Total"
;

我想为作业 WHERE "Jobs"."active" IS TRUE 添加第二行。我如何让这个显示另一行?

我希望最终的结果是这样的:

Status | 5 Minutes | 1 Hour | 1 Day | Total
-------------------------------------------
*                0        0     367  30,989
Active           0        0     123  24,972

标签不是问题。唯一不明显的是如何创建新行。

解决方法

最简单的方法是在另一组查询上使用 UNION,这些查询具有更严格的 where 子句:

SELECT
    '*' as Kind,(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '5 minutes' AND NOW()
    ) as "5 Minutes",(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '1 Hours' AND NOW()
    ) as "1 Hour",(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '1 Day' AND NOW()
    ) as "1 Day",(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    ) as "Total"

UNION ALL

SELECT
    'Active',(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."IsActive" IS TRUE AND "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '5 minutes' AND NOW()
    ) as "5 Minutes",(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."IsActive" IS TRUE AND "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '1 Hours' AND NOW()
    ) as "1 Hour",(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."IsActive" IS TRUE AND "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '1 Day' AND NOW()
    ) as "1 Day",(SELECT COUNT(*)
    FROM public.jobs AS "Jobs"
    WHERE "Jobs"."IsActive" IS TRUE 
    ) as "Total"

,

如果我是你,我更喜欢用这种方式来解决你的问题:

select
  "Jobs"."active" as Status,sum(case when "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '5 minutes' AND NOW() then 1 else 0 end) as "5 Minutes",sum(case when "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '1 Hours' AND NOW() then 1 else 0 end) as "1 Hour",sum(case when "Jobs"."updated_at" "Jobs"."updated_at" BETWEEN NOW() - INTERVAL '1 Day' AND NOW() then 1 else 0 end) as "1 Day",count(*) as "Total"
from public.jobs AS "Jobs"
group by "Jobs"."active"

这样您就可以将表格 public.jobs 读取一次,而不是多次(每个 count 一次)。有了这个选择,按 status 分组是一个简单的 group by 操作

,

基本上,您需要条件聚合。在 Postgres 中,通常使用 filter:

SELECT COUNT(*) FILTER (WHERE j."updated_at" BETWEEN NOW() - INTERVAL '5 minute' AND NOW()) as cnt_5_minutes,COUNT(*) FILTER (WHERE j."updated_at" BETWEEN NOW() - INTERVAL '1 hour' AND NOW()) as cnt_1_hour,COUNT(*) FILTER (WHERE j."updated_at" BETWEEN NOW() - INTERVAL '1 day' AND NOW()) as cnt_1_day,COUNT(*) as Total
FROM public.jobs j;

您可能没有未来的更新日期,因此可以更简单地写为:

SELECT COUNT(*) FILTER (WHERE j."updated_at" >= NOW() - INTERVAL '5 minute') as cnt_5_minutes,COUNT(*) FILTER (WHERE j."updated_at" >= NOW() - INTERVAL '1 hour') as cnt_1_hour,COUNT(*) FILTER (WHERE j."updated_at" >= NOW() - INTERVAL '1 day') as cnt_1_day,COUNT(*) as Total
FROM public.jobs j;

此外,我建议您去掉 updated_at 中的双引号。在标识符周围使用双引号只是一个坏习惯。

,

唯一不明显的是如何创建新行。

基本上,用 UNION ALL 添加第二行。

不过,首先要删除每个指标的所有单独的 SELECT 查询。这是不必要的昂贵(如果桌子不是很小很重要)。带有条件聚合的单个 SELECT 可以替换您的所有原始内容(就像 Gordon 建议的那样)。在 Postgres 9.4 或更高版本中,aggregate FILTER 子句 是要走的路。见:

要获得另一行,您可以运行另一个查询,将过滤器 "active" IS TRUE 添加到每个表达式(归结为 active,因为 boolean 列不需要进一步评估) .

但这会使成本再次翻倍,我们可以避免这种情况。在 CTE 中运行单个 SELECT,并在外部查询中使用 UNION ALL 进行拆分:

WITH cte AS (
   SELECT count(*) FILTER (WHERE updated_at > now() - interval '5 min')             AS ct_5min,count(*) FILTER (WHERE updated_at > now() - interval '5 min' AND active)  AS ct_5min_a,count(*) FILTER (WHERE updated_at > now() - interval '1 hour')            AS ct_1h,count(*) FILTER (WHERE updated_at > now() - interval '1 hour' AND active) AS ct_1h_a,count(*) FILTER (WHERE updated_at > now() - interval '1 day')             AS ct_1d,count(*) FILTER (WHERE updated_at > now() - interval '1 day' AND active)  AS ct_1d_a,count(*)                       AS ct_all,count(*) FILTER (WHERE active) AS ct_all_a
   FROM   public.jobs
   )
SELECT '*' AS status,ct_5min,ct_1h,ct_1d,ct_all
FROM   cte
UNION ALL
SELECT 'Active',ct_5min_a,ct_1h_a,ct_1d_a,ct_all_a
FROM   cte

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res