postgresql - 如何执行像 Informatica 这样的分组等效?
问题描述
我有一个 Informatica 函数,我想将其转换为要在 Spring Batch 代码中使用的查询。
我有一个表EMPLOYEE
(15 fields
我想要的所有选择),Informatica 有功能路由器,它基于 STATUS_CD = 'A'
和默认值创建组(意味着所有其他记录都应该放在这里 - 状态不是 A)。
我们如何在 Postgres 中进行操作?
我有所有员工,我想使用 EMPLOYEE_CD 的组合进行检查,EMPLOYEE_ID 是唯一的,我想简单地返回它的计数。
查询1
SELECT EMPLOYEE_CD AS EMPLOYEE_CD,
EMPLOYEE_ID AS EMPLOYEE_ID,
COUNT (*) AS CNT
FROM EMPLOYEE
GROUP BY EMPLOYEE_CD, EMPLOYEE_ID
HAVING COUNT (*) > 1;
查询 2
SELECT EMPLOYEE_ID, EMPLOYEE_NAME, EMPLOYEE_EMAIL, EMPLOYEE_PHONE, EMPLOYEE_ADDRESS, (Create Count Field here)
FROM EMPLOYEE
查询 3 - 我需要分组(这是我的原始问题)或创建列ACTIVE
,NON_ACTIVE
列作为查询结果的一部分,其中 EMPLOYEE_STAT_CD = 'A',ACTIVE
列值应该说 YES 而EMPLOYEE_STAT_CD
不是A
,NON_ACTIVE
应该说Yes
。
如何将 Query1 和 Query 2 和 Query 3 合并为单个查询?
解决方案
如果我理解了这个问题,您的代码类似于:
SELECT EMPLOYEE_ID, EMPLOYEE_NAME, EMPLOYEE_EMAIL, EMPLOYEE_PHONE, EMPLOYEE_ADDRESS,
COUNT(*)OVER(PARTITION BY EMPLOYEE_CD, EMPLOYEE_ID) AS counter_from_sql1,
CASE WHEN EMPLOYEE_STAT_CD = 'A' THEN 'YES' ELSE NULL END AS ACTIVE,
CASE WHEN EMPLOYEE_STAT_CD <> 'A' THEN 'YES' ELSE NULL END AS NON_ACTIVE
FROM EMPLOYEE;
或者
SELECT * FROM (
SELECT EMPLOYEE_ID, EMPLOYEE_NAME, EMPLOYEE_EMAIL, EMPLOYEE_PHONE, EMPLOYEE_ADDRESS,
COUNT(*)OVER(PARTITION BY EMPLOYEE_CD, EMPLOYEE_ID) AS counter_from_sql1,
CASE WHEN EMPLOYEE_STAT_CD = 'A' THEN 'YES' ELSE NULL END AS ACTIVE,
CASE WHEN EMPLOYEE_STAT_CD <> 'A' THEN 'YES' ELSE NULL END AS NON_ACTIVE
FROM EMPLOYEE
) z
WHERE counter_from_sql1 > 1;
推荐阅读
- react-native - 仅在异步函数中允许等待错误反应本机
- node.js - 使用 mocha 测试猫鼬异步钩子时遇到问题
- sql - 获取没有 ROWCOUNT 的查询结果集返回的行数
- oracle - 当我需要按名字和姓氏查询时,我应该如何在 Oracle 中索引 FULLNAME 字段?
- svg - 有没有办法让用户上传 SVG 文件,然后渲染 SVG 源?
- excel - VBA - 插入公式并转换为值
- laravel - Laravel 中间关系数据错误
- r - 使用 R 将“84+3”等字符转换为数值变量
- python - 检查匹配组是否存在而没有“尝试”?
- flutter - 共享首选项和全局配置之间的 Flutter 差异