MySQL Восхождение полученных таблиц из вложенного запроса

StackOverflow https://stackoverflow.com/questions/5330166

Вопрос

Я опубликовал что-то похожее на это вчера, но теперь я хотел бы что-то немного отличаться от моего запроса-

Я пытаюсь запросить базу данных, чтобы получить количество одноразовых пользователей, которые посетили веб-сайт с течением времени. Данные выглядят примерно так:

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top