0

昨日、これに似たものを投稿しましたが、今は私のクエリとは少し違うものをお願いします-

データベースにクエリを実行して、時間の経過とともに Web サイトにアクセスしたワンタイム ユーザーの数を取得しようとしています。データは次のようになります。

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 です。これは、これらの日の終わりに、1 回訪問したユーザーが X 人いるためです。たとえば、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 回限りのユーザーのみを考慮し、繰り返しユーザーを考慮したくないということです。

ありがとう

4

1 に答える 1

2

このサブクエリは、明確な要件に対して機能するはずです。

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;
于 2011-03-16T19:07:26.060 に答える