【问题标题】:How to imitate SQL update on in memory table variables in pentaho如何在 pentaho 中模拟内存表变量中的 SQL 更新
【发布时间】:2017-05-15 13:46:00
【问题描述】:

我是 pentaho 的新手。基本上我对层次结构数据有一个要求,我选择一个层次结构的子集,我需要在较低级别的节点上进行计数/求和,然后逐级进行计数+先前的计数总和等。这就是我所知道的使用表变量执行 sql(这里的要点是我需要在内存中执行此操作,而不是在数据表中执行任何更新。)

DECLARE @ConsolidateMaster TABLE
(
-- my fields
)

INSERT @ConsolidateMaster
--select some sub set data and inset into table variable


UPDATE A
SET A.[DIR_REPORT_CNT] = 0,
    A.[DIR_REPORT_COST] = 0,
    A.[TOTAL_REPORT_CNT] = 0,
    A.[TOTAL_REPORT_COST] = 0
FROM @ConsolidateMaster A
LEFT JOIN @ConsolidateMaster B
ON A.EMP_ID = B.SUPERVISOR_ID
WHERE B.EMP_ID IS NULL AND A.PROJ_CD = @PROJ_CD

--GO UP LEVEL BY LEVEL AND START COUNTING THE TOTAL + COST
DECLARE @MAX_LEVEL INT = (SELECT MAX(SUPERVISOR_LAYER) FROM @ConsolidateMaster WHERE PROJ_CD = @PROJ_CD)

WHILE (SELECT COUNT(1) FROM @ConsolidateMaster WHERE [DIR_REPORT_CNT] IS NULL) > 0
BEGIN
    UPDATE 
        A
    SET 
        A.DIR_REPORT_CNT = B.DIR_REPORT_CNT,
        A.DIR_REPORT_COST = B.DIR_REPORT_COST,
        A.TOTAL_REPORT_CNT = B.TOTAL_REPORT_CNT,
        A.TOTAL_REPORT_COST = B.TOTAL_REPORT_COST
    FROM @ConsolidateMaster A
    INNER JOIN 
    (
    SELECT 
        C.SUPERVISOR_ID,
        COUNT(1) DIR_REPORT_CNT,
        SUM(ISNULL(ANNUAL_COST,0)) DIR_REPORT_COST,
        SUM(C.[TOTAL_REPORT_CNT]) + COUNT(1) TOTAL_REPORT_CNT,
        SUM(C.TOTAL_REPORT_COST) + SUM(ISNULL(ANNUAL_COST,0)) TOTAL_REPORT_COST
    FROM @ConsolidateMaster C
    WHERE 
        C.SUPERVISOR_LAYER = @MAX_LEVEL 
        AND C.PROJ_CD = @PROJ_CD
    GROUP BY 
        C.SUPERVISOR_ID
    ) B
    ON A.EMP_ID = B.SUPERVISOR_ID
    WHERE A.PROJ_CD = @PROJ_CD 
          AND A.SUPERVISOR_LAYER < @MAX_LEVEL

    SET @MAX_LEVEL = @MAX_LEVEL - 1
END

在对 sql 中的临时变量进行更新后,我只需从 @ConsolidateMaster 中选择 *。我如何在 pentaho 中实现类似的功能。

【问题讨论】:

  • 如果你已经在 SQL 中完成并准备好了,为什么还需要 PDI?如果您更详细地描述您的预期解决方案,人们会更容易给出比“使用 Group By”更具体的答案。
  • @Cyrus 好吧,这就是我告诉我的上级的,但他们告诉我我们正在使用 JDBC 和 Pentaho,目前在 db 中没有存储过程。 (基本上按架构)。我不需要特定的解决方案,我只需要有关如何在 pentaho 中复制表变量功能的提示。 (在内存中进行行更新操作。)

标签: sql-server pentaho kettle pentaho-data-integration


【解决方案1】:

您不应该问如何在 Kettle 中模拟 Table 数据类型。您找到了 T-SQL 问题的解决方案,我了解,但 T-SQL 和 Kettle 不能在相同的抽象级别上工作。暂时忘记您的解决方案,并专注于您的问题:“如何提取存储为数据库(SQL Server)中的邻接列表的分层数据并使用数据流工具(Kettle)聚合(计数,求和)某些列?”。

有一个名为 Closure Generator 的步骤能够计算您的关系 ConsolidateMaster 的传递闭包并发出元组 [supervisor_id, emp_id, distance]。 Merge-JoinSort RowsGroup By 应该会产生您想要的结果。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2017-11-03
    • 2018-12-05
    • 1970-01-01
    • 2016-06-21
    • 2019-11-13
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多