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;
不隶属于 StackOverflow