【问题标题】:Teradata query pagination - batch every 1000 recordsTeradata 查询分页 - 每 1000 条记录批处理
【发布时间】:2019-05-18 06:17:39
【问题描述】:

我有这个 Teradata 查询:

WITH ID(ROW_NUM) AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY PRSN_ID) AS ROW_NUM
    FROM MyTable 
    WHERE ACTIVE_IND = 'Y' 
    GROUP BY PRSN_ID
)
SELECT ROW_NUM-ROW_NUM MOD 2 AS FirstIndex,
ROW_NUM-(ROW_NUM-1) MOD 2 AS SecondIndex
FROM ID
WHERE ROW_NUM MOD 2=1

这个查询会生成一个ID列,结果会是这样的:

FirstIndex    SecondIndex
0             1
2             3
4             5  
.             .
.             .
etc           etc

我想通过 1000 条记录将选择更改为批处理,如下所示:

FirstIndex    SecondIndex
0             1000
1001          2000
2001          3000  
3001          4000
.             .
.             .
etc           etc

感谢您的帮助。

【问题讨论】:

    标签: sql database teradata teradata-sql-assistant


    【解决方案1】:

    你的计算太复杂了:

       ROW_NUM-1 AS FirstIndex,
       ROW_NUM   AS SecondIndex
    

    要获得您要求的范围,您只需修改计算,例如

    SELECT 
       CASE WHEN ROW_NUM = 1 THEN 0 ELSE SecondIndex-999 END AS FirstIndex,
       (ROW_NUM+2)/2 * 1000 AS SecondIndex
    FROM ID
    WHERE ROW_NUM MOD 2=1
    

    但是你想用那个结果做什么,批处理 what

    编辑:

    目前还不清楚为什么需要第二个表来计算范围,但这会为任何 n 行的页面大小创建从 1 开始的范围:

    WITH ID(ROW_NUM) AS 
    (  -- just to get some rows
        SELECT day_of_calendar AS row_num
        FROM sys_calendar.CALENDAR
        WHERE row_num BETWEEN 1 AND 10
    )
    SELECT 1000 AS RowsPerPage,
       Row_Num AS page_num,
       rownum_to - (RowsPerPage-1) AS rownum_from,
       page_num * RowsPerPage AS rownum_to
    FROM ID
    GROUP BY page_num
    ORDER BY page_num
    
    RowsPerPage     page_num     rownum_from     rownum_to
           1000            1               1          1000
           1000            2            1001          2000
           1000            3            2001          3000
           1000            4            3001          4000
           1000            5            4001          5000
           1000            6            5001          6000
           1000            7            6001          7000
           1000            8            7001          8000
           1000            9            8001          9000
           1000           10            9001         10000
    

    【讨论】:

    • 感谢您的快速响应,我想在 Talend 中使用它来一次批处理 1000 条记录并通过 Web 服务请求发送。我注意到您的查询在您的第二条记录中跳转到 2000,您的查询也生成了 76 条记录(页),而我现在在 MyTable 上只有 151 条记录。
    • 当你有 1000 或 2000 条记录时,这也不起作用,你能帮忙吗?
    • 我的查询完全返回您的预期结果。我仍然不完全理解你想要做什么:你有另一个 Select 有数千行,序列号由 ROW_NUMBER 生成?并且您想使用您的查询来定义要返回的“页面”?
    • 是的,这是真的,想法是在开始时查询页面,然后 Talend 将遍历页面以获取每个页面的 1000 条记录并通过 SOAP 服务调用发送。但是我刚刚尝试了您的查询,第一行丢失了,当我们有 1000 或 2000 条记录时它不起作用。
    • 是的,我确实需要第二个表,因为我需要一个顺序 ID 来执行分页。我会尝试你更新的查询,并会让你知道。谢谢!
    【解决方案2】:

    您好,您可以尝试以下查询一次,这将为您提供所需的序列。

    select ROW_NUM,FirstIndex, coalesce(case when SecondIndex<1000 then (SecondIndex+2000) else (SecondIndex+1000) end,FirstIndex+1001) as SecondIndex from 
    (SELECT ROW_NUM,
    case when (FirstIndex < 1000) then (FirstIndex+1001) else (FirstIndex+1) end as FirstIndex,
    (min(FirstIndex) OVER(ORDER BY FirstIndex ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING))  SecondIndex
    FROM (Select (ROW_NUMBER() OVER (ORDER BY PRSN_ID)-1) AS ROW_NUM,(ROW_NUMBER() OVER (ORDER BY PRSN_ID)-1) AS FirstIndex from Mytable GROUP BY PRSN_ID) A) B
    order by ROW_NUM;
    

    【讨论】:

    • 谢谢!,但这效果不好,第一页/范围不是以 0 或 1 - 1000 开头,还想象一下,如果我有 3000 条记录,我应该只看到 3 条记录/pages/ranges,有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2023-03-02
    • 2014-07-09
    • 2021-01-18
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多