MySQL Восхождение полученных таблиц из вложенного запроса
-
26-10-2019 - |
Вопрос
Я опубликовал что-то похожее на это вчера, но теперь я хотел бы что-то немного отличаться от моего запроса-
Я пытаюсь запросить базу данных, чтобы получить количество одноразовых пользователей, которые посетили веб-сайт с течением времени. Данные выглядят примерно так:
Day | UserID
1 | A
1 | B
2 | B
3 | A
4 | B
4 | C
5 | D
Я бы хотел, чтобы результат запроса посмотрел это
Time Span | COUNT(DISTINCT UserID)
Day 1 to Day 1 | 2
Day 1 to Day 2 | 1
Day 1 to Day 3 | 0
Day 1 to Day 4 | 1
Day 1 to Day 5 | 2
Результатом является 2,1,0,1,2, потому что, в конце тех дней, есть x число пользователей, которые посетили одно время. Например, для 5 -го дня, в конце 5 дня, пользователи C и D посетили только один раз каждый.
Я думаю, что ищу запрос, похожий на это:
select d.day, (select count(distinct userid) from visits where day<=d.day)
from (select distinct day from visits) d
Разница между вышеупомянутым запросом и тем, что я ищу, заключается в том, что я бы хотел, чтобы этот новый запрос рассмотрел только одноразовые пользователи для каждого периода времени, а не повторять пользователей.
Спасибо
Решение
Этот подзадатель должен работать для разъясненных требований.
select d.day, count(distinct case when b.userid is null then a.userid end)
from (select day from visits group by day) d
inner join
(
select a.day, a.userid, count(*) c
from visits a
join visits b on a.userid=b.userid and b.day <= a.day
group by a.day, a.userid
having count(*) = 1
) a on a.day <= d.day
left join
(
select a.day, a.userid, count(*) c
from visits a
join visits b on a.userid=b.userid and b.day <= a.day
group by a.day, a.userid
having count(*) > 1
) b on a.userid = b.userid and b.day <= d.day
group by d.day
Оригинал
Вы, должно быть, взяли эту идею от SQL Server - это единственная RDBMS (IIRC), которая позволит вам ссылаться на дважды удаленный (гнездовый) запрос. Пожалуйста, укажите, что вы хотите, и мы можем переписать запрос.
Что касается точного запроса, вам не нужны 2 уровня подразделения
SELECT
C.col_c1 AS Data,
(
SELECT count(col_b1)
FROM tbl
WHERE col_b2 <= C.col_c1
) A
FROM (
SELECT col_c1 # subquery to get distinct c1
FROM tbl
GROUP BY col_c1) C;