1

このクエリがあります

 --Retention by DOC,Users created >= Jan 1,2012--
Select 
One.Date_Of_Concern,
Two.Users, 
One.Retained,
Round(One.Retained/Two.Users,4) as Perc_Retained
From
(
Select 
To_Date('2012-sep-09','yyyy-mon-dd')As Date_Of_Concern,
Count(P.Player_Id) As Retained
From Player P
Where
Trunc(P.Create_Dtime) >= To_Date('2012-Jan-01','yyyy-mon-dd')
 And
(To_Date('2012-sep-09','yyyy-mon-dd')-Trunc(P.Init_Dtime))<=7
 ) One
Inner Join
(
Select 
To_Date('2012-sep-09','yyyy-mon-dd')As Date_Of_Concern,
Count(P.Player_Id) As Users
From Player P
Where
Trunc(P.Create_Dtime) >= To_Date('2012-Jan-01','yyyy-mon-dd')
) Two On One.Date_Of_Concern = Two.Date_Of_Concern

1行の結果が得られます:

Date_Of_Concern     USERS     RETAINED     PERC_RETAINED
09-Sep-12            449773    78983        0.1756

ある種の日付変更方法を追加して、このクエリを改善したいと思います。そうすれば、2012 年 9 月 9 日、2012 年 9 月 10 日、2012 年 9 月 11 日など、毎回クエリを実行する必要がなくなります。代わりに、次のようにすべて同じクエリに表示されます。

Date_Of_Concern     USERS     RETAINED     PERC_RETAINED
09-Sep-12            449773    48783        0.1756
10-Sep-12            449773    46777        0.1600
11-Sep-12            440773    44852        0.1500
12-Sep-12            349773    42584         0.1400
4

2 に答える 2

1

さて、与えられた情報では、参加してそれらの日付を持ってくることができるテーブルがあるかどうかわかりません. ただし、そうでない場合は、これを試すことができます。

行を生成し、日付を連続した形式で再現する必要があります。しかし、最初に、行を生成する方法を見てみましょう。

5 行を生成します。

SELECT rownum 
FROM dual 
CONNECT BY LEVEL <= 5;

 ROWNUM
----------
         1
         2
         3
         4
         5

これを適用して、日付のデータ ソースを再現します。

SELECT to_date('2012-sep-09','yyyy-mon-dd') + (rownum -1) as Date_Of_Concern
FROM dual 
CONNECT BY LEVEL <= 5;

 Date_Of_Concern
----------
 2012-sep-09
 2012-sep-10
 2012-sep-11
 2012-sep-12
 2012-sep-13

当然、開始日が必要です。さらに、数字の 5 は、必要な日付の数に置き換える必要があります。次のような日付範囲にすることができます。

SELECT to_date('2012-sep-09','yyyy-mon-dd') + (rownum -1) date
FROM dual 
CONNECT BY LEVEL <= (to_date('2012-sep-20','yyyy-mon-dd') - to_date('2012-sep-09','yyyy-mon-dd'));

OK、最終結果は次のようになります。

SELECT  both.Date_Of_Concern,
        both.Retained,
        both.Users,
        Round(both.Retained/both.Users,4) as Perc_Retained
  FROM (select Date_Of_Concern,
              (Select Count(P.Player_Id) As Retained
                From Player P
                Where Trunc(P.Create_Dtime) >= To_Date('2012-Jan-01','yyyy-mon-dd')
                  And (Date_Of_Concern-Trunc(P.Init_Dtime))<=7) Retained,
              (Select Count(P.Player_Id) As Users
                    From Player P
                    Where Trunc(P.Create_Dtime) >= To_Date('2012-Jan-01','yyyy-mon-dd')
                ) Users
          from (SELECT to_date('2012-sep-09','yyyy-mon-dd') + (rownum -1) Date_Of_Concern,
                FROM dual 
                CONNECT BY LEVEL <= 5)) both
于 2012-10-04T00:06:47.480 に答える
0

クエリを大幅に簡素化できると感じています。ここでは、2012 年の初めから日ごとに一覧表示しようとしています。どのような範囲を探しているかによって異なります。

SELECT date_of_concern
      ,Running_Total_Users AS Users
      ,Running_Total_Retained As Retained
      ,ROUND(Running_Total_Retained / Running_Total_Users, 4) AS Perc_Retained

  FROM ( SELECT date_of_concern

               ,SUM(Users) OVER( ORDER BY date_of_concern
                                 ROWS BETWEEN UNBOUNDED PRECEDING
                                          AND CURRENT ROW ) AS Running_Total_Users

               ,SUM(Retained) OVER( ORDER BY date_of_concern
                                 ROWS BETWEEN UNBOUNDED PRECEDING
                                          AND CURRENT ROW ) AS Running_Total_Retained

           FROM ( SELECT TRUNC(Create_Dtime) date_of_concern
                        ,COUNT(Player_Id) Users
                        ,SUM( CASE WHEN (TRUNC(Create_Dtime) - TRUNC(Init_Dtime)) <= 7 THEN 1 ELSE 0 END ) AS Retained
                    FROM player ON ( TRUNC(.Create_Dtime) >= TO_DATE('2012', 'YYYY') )
                )
        )

最も内側のクエリは、投稿されたクエリを 1 日目 (2012 年 1 月 1 日) から数えて書き直す試みです。次に、次のラッパーは、その後の各日の累計を実行することになっています。最後のラッパーは、Perc_Retained. もちろん未テストで完了:)

于 2012-10-04T01:11:00.310 に答える