Teradata получить количество строк за предыдущие два дня и сравнить - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь настроить проверку данных, где мы получаем количество строк из таблицы на сегодняшний день и предыдущую дату. Поскольку он не загружается в выходные или праздничные дни, я не могу сказать ДАТА-1.

Я придумал следующее, чтобы получить предыдущую дату:

SELECT
LOAD_DATE
,COUNT(LOAD_DATE) RW_COUNT
,ROW_NUMBER() OVER (ORDER BY LOAD_DATE ) AS LOAD_ROWNUM
FROM DATABASE1.TABLE1
WHERE LOAD_DATE >= DATE-6
GROUP BY 1

Этопроизводит даты, считает и присваивает номер строки.

LOAD_DATE   RW_COUNT    LOAD_ROWNUM
2019-10-16  8259        1
2019-10-15  8253        2
2019-10-11  8256        3
2019-10-10  8243        4

I, чтобы взять две самые актуальные даты и сравнить их. Самым текущим будет «текущий», а вторым самым текущим будет «предыдущий». Тогда я хотел бы иметь что-то вроде этого в качестве набора результатов:

CURRENT_COUNT   PRIOR_COUNT DIFF_PERCENT
8259            8253        .9927

Моя проблема в том, как мне сослаться на первые две строки и сравнить их друг с другом? Если я не слишком обдумываю это, мне понадобятся два дополнительных оператора SELECT: 1 с предложением WHERE, ссылающимся на строку 1, и другой с ссылкой WHERE, ссылающейся на строку 2.

Как мне это сделать? Есть ли у меня два CTE?
В конце концов мне понадобится третий SELECT, разделяющий две строки и проверяющий на 10% допуск. Помогите, я в разборе паралича.

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Вы можете отфильтровать результат OLAP-функции, используя QUALIFY:

SELECT
   LOAD_DATE
  ,COUNT(LOAD_DATE) AS CURRENT_COUNT
   -- previous day's count
  ,LEAD(RW_COUNT)
   OVER (ORDER BY LOAD_DATE DESC) AS PRIOR_COUNT
-- if your TD version doesn't support LAG/LEAD (i.e. < 16.10)
--,MIN(RW_COUNT) 
-- OVER (ORDER BY LOAD_DATE DESC
--       ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS PRIOR_COUNT

   ,CAST(CURRENT_COUNT AS DECIMAL(18,4)) / PRIOR_COUNT AS DIFF_PERCENT
FROM DATABASE1.TABLE1
WHERE LOAD_DATE >= DATE-6
GROUP BY 1
-- return the latest row only
QUALIFY ROW_NUMBER() OVER (ORDER BY LOAD_DATE DESC) = 1

, проверяя на 10% допуск :

DIFF_PERCENT BETWEEN 0.9 and 1.1

Либо ANDed дляКАЧЕСТВЕННО или В СЛУЧАЕ

1 голос
/ 16 октября 2019

Если ваша TD версия (16.0+?) Не поддерживает LEAD/LAG, попробуйте:

SELECT 
  load_date, 
  RW_COUNT, 
  MAX(RW_COUNT) OVER(
    ORDER BY load_date DESC
    ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING -- Get previous row's value
  ) AS RW_COUNT_prev
FROM (
  SELECT load_date, COUNT(LOAD_DATE) RW_COUNT,
  FROM DATABASE1.TABLE1
  WHERE LOAD_DATE >= DATE-6
  GROUP BY 1
) src
1 голос
/ 16 октября 2019

Я не знаю, что вы хотите для вашего набора результатов. Но вы можете использовать LAG() с агрегацией, чтобы получить предыдущее значение.

SELECT LOAD_DATE, COUNT(*) as RW_COUNT,
       LAG(COUNT(*)) OVER (ORDER BY LOAD_DATE) as PREV_RW_COUNT
FROM DATABASE1.TABLE1
WHERE LOAD_DATE >= DATE-6
GROUP BY 1;

Вы можете просто захотеть разницу между двумя счетами.

...