Mysql ссылается на производные таблицы из вложенного запроса - PullRequest
0 голосов
/ 16 марта 2011

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

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

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 потому что в конце тех дней число пользователей, посетивших один раз, было Х.например, на 5-й день, в конце 5-го дня пользователи c и d посетили только один раз.

Я думаю, что ищу запрос, подобный следующему:

select d.day, (select count(distinct userid) from visits where day<=d.day)
from (select distinct day from visits) d

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

Спасибо

1 Ответ

1 голос
/ 16 марта 2011

Этот подзапрос должен работать для уточненных требований.

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 - это единственная СУБД (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;
...