首页 > 解决方案 > 如何执行像 Informatica 这样的分组等效?

问题描述

我有一个 Informatica 函数,我想将其转换为要在 Spring Batch 代码中使用的查询。

我有一个表EMPLOYEE15 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 - 我需要分组(这是我的原始问题)或创建列ACTIVENON_ACTIVE列作为查询结果的一部分,其中 EMPLOYEE_STAT_CD = 'A',ACTIVE列值应该说 YES 而EMPLOYEE_STAT_CD不是ANON_ACTIVE应该说Yes

如何将 Query1 和 Query 2 和 Query 3 合并为单个查询?

标签: postgresqlinformatica

解决方案


如果我理解了这个问题,您的代码类似于:

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;

推荐阅读