#sql #teradata
#sql #teradata
Вопрос:
У меня есть этот SQl:
Select b. Date, count(b. Name) from
(Select date, name, order_no from table1 where date = ‘2020-01-31’ and 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-28’ and 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-31’ and 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