Разбиение на запросы Teradata - пакет каждые 1000 записей - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть запрос 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

Этот запрос сгенерирует столбец идентификатора, и в результате будет что-то вроде этого:

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

Я хотел бы изменитьвыбор из 1000 записей, как показано ниже:

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

Ваша помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Привет, вы можете попробовать запрос ниже, это даст вам желаемую последовательность.

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 голосов
/ 18 декабря 2018

Ваш расчет слишком сложен:

   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

Но что вы хотите сделать сэтот результат, пакет что ?

Редактировать:

Пока неясно, зачем вам нужна вторая таблица для вычисления диапазонов, но это создает диапазоны, начинающиеся с 1 для любого размера страницыиз n строк:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...