Выполнение SQL-запроса с превышением лимита использования ЦП

#sql #teradata

#sql #teradata

Вопрос:

У меня есть этот SQl:

 Select b. Date, count(b. Name) from
(Select date, name, order_no from table1 where date =2020-01-31and order_no not in ( select order_no from table1where date <2020-01-31’)) b
Inner join
( select name from table2 where date1<2020-01-31’)a
On a. Name= b. Name group by 1
UNION

Select b. Date, count(b. Name) from
(Select date, name, order_no from table1 where date =2020-02-28and order_no not in ( select order_no from table1where date <2020-02-28’)) b
Inner join
( select name from table2 where date1<2020-02-28’)a
On a. Name= b. Name group by 1
UNION

Select b. Date, count(b. Name) from
(Select date, name, order_no from table1 where date =2020-03-31and order_no not in ( select order_no from table1where date <2020-03-31’)) b
Inner join
( select name from table2 where date1<2020-03-31’)a
On a. Name= b. Name group by 1
UNION
...... until ‘2020-12-31

Занимает слишком много ЦП.
Любая помощь? В основном я пытаюсь принимать заказы и имена клиентов, которые являются новыми для каждого месяца, из таблицы1, а затем проверять эти имена клиентов, если они существовали до этого месяца в таблице2. Таблица 2 — это таблица истории, настолько огромная, и в ней нет поля date1.
Спасибо за любую помощь здесь

Комментарии:

1. Примеры данных и желаемые результаты помогут. Кроме того, предоставьте четкое объяснение логики, которую вы пытаетесь реализовать.

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

3. . . . Я этого вообще не вижу. Вы просматриваете только одну дату в месяц table1 .

4. Table1 — это ежемесячная таблица, в которой данные за весь месяц представлены как данные на конец месяца.

5. Ваше объяснение и SQL сбивают с толку. Вы сравниваете order_no в своем подзапросе, но обычно это уникально, можете ли вы добавить больше деталей? Получение новых клиентов за каждый месяц можно легко выполнить, используя row_number вместо этих объединений. Аналогично для table2, а затем это одно соединение плюс количество

Ответ №1:

Это может быть то, что вы хотите:

 with t1 as 
 (
    Select datecol -- already last day of month
      ,name
    from table1
    qualify
       row_number() -- oldest row per name, i.e. new in this month
       over (partition by name 
             order by datecol) = 1
 ),
t2 as 
 (
    Select last_day(datecol) as datecol -- last day of month
      ,name
    from table2
    qualify
       row_number() -- oldest row 
       over (partition by name 
             order by datecol) = 1
 )
select t2.datecol, count(*)
from t1 join t2
  on t1.name = t2.name       -- same customer
 and t1.datecol > t2.datecol -- older row exists
group by 1
order by 1