Mysql引用嵌套查询的派生表

时间:2011-03-16 18:43:28

标签: mysql sql derived-table nested-queries

昨天我发布了与此相似的内容,但现在我想要与我的查询略有不同 -

我正在尝试查询数据库以检索随着时间的推移访问过网站的一次性用户的数量。数据看起来像这样:

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

上面的查询与我正在寻找的内容之间的区别在于,我希望这个新查询只考虑每个时间跨度的一次性用户,而不是重复用户。

由于

1 个答案:

答案 0 :(得分:1)

此子查询应该适用于明确的要求。

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;