1

私はこの簡単なクエリを持っています:

Select 
To_Date('2012-sep-03','yyyy-mon-dd')as Date_Of_Concern,
Count(Player_Id) as Retained
From Player
Where
(To_Date('2012-sep-03','yyyy-mon-dd')-Trunc(Init_Dtime))<=7

結果:

Date_Of_Concern         Retained
 03-Sep-12               81319

このクエリは、特定の日付から 7 日以内にログイン (init_dtime) したデータベース内のすべてのプレイヤーをカウントします。

現状では、知りたい「懸念の日」ごとに、このクエリを複数回実行する必要があります。より良い解決策はありますか?

4

4 に答える 4

1

このクエリを複数の日付に対して実行する必要がある場合は、複数の値を保持する手段が必要になります。オブジェクトを使用することをお勧めしNESTED TABLEます:

CREATE TYPE my_dates AS TABLE OF DATE;
/

SELECT d.column_value AS Date_Of_Concern, count(Player_Id) AS Retained
  FROM Player
  JOIN TABLE (my_dates(to_date('2012-sep-03', 'yyyy-mon-dd'),
                       to_date('2012-sep-04', 'yyyy-mon-dd'),
                       to_date('2012-sep-05', 'yyyy-mon-dd'))) d
          ON d.column_value - trunc(Init_Dtime) BETWEEN 0 AND 7
 GROUP BY d.column_value
于 2012-09-21T10:04:06.723 に答える
1

単にGROUP BY日ごとのカウントを取得するために使用します。

Select 
To_Date(Init_Dtime,'yyyy-mon-dd') as Date_Of_Concern,
Count(Player_Id) as Retained
From Player
Where
(To_Date('2012-sep-03','yyyy-mon-dd') - Trunc(Init_Dtime)) <= 7
GROUP BY To_Date(Init_Dtime,'yyyy-mon-dd')
ORDER BY To_Date(Init_Dtime,'yyyy-mon-dd')
于 2012-09-20T23:02:27.833 に答える
0

私があなたを正しく理解したかどうかはわかりませんが、これはおそらくあなたが望むものです. ただし、最適なパフォーマンスが得られない場合があります。

12:32:22 HR@vm_xe> l                                                                        
  1   with player(id, dt) as (                                                              
  2     select 1, date '2012-01-01' from dual union all                                     
  3     select 2, date '2012-01-01' from dual union all                                     
  4     select 3, date '2012-01-02' from dual union all                                     
  5     select 4, date '2012-01-03' from dual union all                                     
  6     select 5, date '2012-01-04' from dual union all                                     
  7     select 6, date '2012-01-05' from dual union all                                     
  8     select 7, date '2012-01-06' from dual union all                                     
  9     select 8, date '2012-01-07' from dual union all                                     
 10     select 9, date '2012-01-08' from dual union all                                     
 11     select 10, date '2012-01-09' from dual union all                                    
 12     select 11, date '2012-01-10' from dual                                              
 13   )                                                                                     
 14     select distinct                                                                     
 15            to_char(dt, 'dd-mm-yyyy') dt                                                 
 16            ,count(*) over (order by trunc(dt) range interval '7' day preceding) week_cnt
 17       from player                                                                       
 18*     order by 1, 2                                                                      
12:32:22 HR@vm_xe> /                                                                        

DT           WEEK_CNT                                                                       
---------- ----------                                                                       
01-01-2012          2                                                                       
02-01-2012          3                                                                       
03-01-2012          4                                                                       
04-01-2012          5                                                                       
05-01-2012          6                                                                       
06-01-2012          7                                                                       
07-01-2012          8                                                                       
08-01-2012          9                                                                       
09-01-2012          8                                                                       
10-01-2012          8                                                                       

10 rows selected.                                                                           

Elapsed: 00:00:00.01                                                                        

psのようなコードはありません

(To_Date('2012-sep-03','yyyy-mon-dd')-Trunc(Init_Dtime))<=7

コードのような

init_time between to_date('2012-SEP-03', 'yyyy-mon-dd') and to_date('2012-SEP-03', 'yyyy-mon-dd') + 7 

もちろん、インデックスを気にしない限り:)

于 2012-09-21T04:20:33.053 に答える
0

指定日から7日以内

やりたいことができるようにするには、数式または日付範囲のいずれかで、どの「特定の日付」について話しているかを知る必要があります。ランダムな日付は明らかに、ユーザーがその日付を入力するか、その日付に対して実行するようにクエリを変更する必要があります(前述の方法)。

于 2012-09-20T23:20:51.900 に答える