Положение:
У меня есть две таблицы. # t1 имеет логины и электронные письма. # t2 имеет страну, связанную с каждым письмом.
Я хотел бы присоединить информацию от # t2 к # t1 без необходимости присоединяться к ней дважды. Присоединение к нему только один раз во внутреннем или внешнем запросе нарушит логику cross apply
.
Мой текущий запрос использует перекрестное применение для получения скользящей информации как таковой (данные скрипта ниже):
SELECT DISTINCT CAST(logins AS DATE) AS Dates,
count(distinct d.email) AS DAU,
count(distinct m.MAU) AS MAU
FROM #t1 d
CROSS APPLY (
SELECT CAST(m.logins as date) as dates, m.email AS MAU
FROM #t1 m
WHERE m.logins BETWEEN d.logins and DATEADD(dd, 30, d.logins)
) m
group by CAST(logins as date)
Единственный способ, которым я нашел объединение двух таблиц без необходимости разбивать кросс-запрос, - это inner join
это как во внешнем, так и во внутреннем запросе, что, вероятно, неверно, но, по крайней мере, вывод верен. Я делаю это, чтобы добавить второе условие в оператор where во внутреннем запросе. когда я применяю логику к моей фактической таблице, производительность ужасна (данные скрипта ниже):
SELECT distinct CASt(logins AS DATE) AS Dates,
#t2.country,
count(distinct d.email) AS DAU,
count(distinct m.MAU) AS MAU
FROM #t1 d
inner join #t2 on d.email=#t2.email
CROSS APPLY (
SELECT cast(m.logins as date) as dates, m.email AS MAU, country.country AS country
FROM #t1 m
inner join #t2 country on m.email=country.email
WHERE m.logins BETWEEN d.logins and DATEADD(dd, 30, d.logins)
and #t2.country = country.country
) m
group by cast(logins as date), #t2.country
+-------------+---------+-----+-----+
| Dates | country | DAU | MAU |
+-------------+---------+-----+-----+
| 2019-04-01 | france | 1 | 2 |
| 2019-04-02 | france | 1 | 2 |
| 2019-04-03 | france | 1 | 2 |
| 2019-04-10 | france | 1 | 1 |
| 2019-04-03 | italie | 2 | 2 |
+-------------+---------+-----+-----+
Цель:
Как найти способ объединить информацию из одной таблицы в другую, не объединяя ее дважды. (данные скрипта ниже)
Результат должен выглядеть следующим образом (вывод из второго запроса выше):
- DAU: сколько разных регистраций в каждой стране произошло в день 'x'
- MAU: сколько разных логинов в каждой стране произошло между днем 'x'
и через 30 дней.
Fiddle:
create table #t1 (email varchar(max), logins datetime)
insert into #t1 values
('aa@gmail.com', '2019-04-01 00:00:00.000'),
('aa@gmail.com', '2019-04-02 00:00:00.000'),
('aa@gmail.com', '2019-04-03 00:00:00.000'),
('zz@gmail.com', '2019-04-10 00:00:00.000'),
('cc@gmail.com', '2019-04-03 00:00:00.000'),
('dd@gmail.com', '2019-04-03 00:00:00.000'),
('dd@gmail.com', '2019-04-03 00:00:00.000')
create table #t2 (country varchar(max), email varchar(max))
insert into #t2 values
('france', 'aa@gmail.com'),
('france', 'zz@gmail.com'),
('italie', 'cc@gmail.com'),
('italie', 'dd@gmail.com')