MySQLは、ネストされたクエリから派生テーブルを緩めます
-
26-10-2019 - |
質問
私は昨日これに似たものを投稿しましたが、今は私の質問と少し違うものが欲しいです -
データベースを照会して、時間の経過とともにウェブサイトにアクセスした1回限りのユーザーの数を取得しようとしています。データは次のようになります:
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が1回訪問したユーザーが数多くいるからです。たとえば、5日目の5日目の終わりに、ユーザーCとDはそれぞれ1回だけ訪問しました。
私はこれに似た質問を探していると思います:
select d.day, (select count(distinct userid) from visits where day<=d.day)
from (select distinct day from visits) d
上記のクエリと私が探していることの違いは、この新しいクエリに、リピートユーザーではなく、各期間スパンの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からアイデアを取得している必要があります。これは、2回の削除(ネスト)クエリを参照できる唯一の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