2

次のコードはおそらく自明です

6月1日のアクティブなサブスクライバーの数を一覧表示します

select 
    count(subscribers) as activeSubscribers 
from subscriberlist sub 
where 
    to_date('2012-06', 'yyyy-mm') 
        between sub.firstDayOfSubscription and sub.lastDayOfSubscription

しかし、昨年の毎月初めに加入者数を取得したい場合は、どうすればよいですか(クエリの日付を変更して繰り返す以外に)。

4

2 に答える 2

1

次のように月のリストを生成できます。

SELECT add_months (trunc (to_date('01/01/2012','MM/DD/YYYY'), 'MM'), 1*LEVEL -1) FirstDay
        FROM Dual
     CONNECT BY LEVEL <= MONTHS_BETWEEN(to_date('12/31/2012','MM/DD/YYYY'), to_date('01/01/2012','MM/DD/YYYY')) + 1
       ORDER BY FirstDay

これにより、次の出力が得られます。

FIRSTDAY
--------
January, 01 2012 00:00:00+0000
February, 01 2012 00:00:00+0000
March, 01 2012 00:00:00+0000
April, 01 2012 00:00:00+0000
May, 01 2012 00:00:00+0000
June, 01 2012 00:00:00+0000
July, 01 2012 00:00:00+0000
August, 01 2012 00:00:00+0000
September, 01 2012 00:00:00+0000
October, 01 2012 00:00:00+0000
November, 01 2012 00:00:00+0000
December, 01 2012 00:00:00+0000

次に、次のように、そのクエリをインラインビューとして含めることができます。

SELECT months.FirstDay,
       (SELECT count(subscribers)
          FROM subscriberlist sub
         WHERE months.FirstDay BETWEEN sub.firstDayOfSubscription AND sub.lastDayOfSubscription
       ) AS activeSubscribers
FROM (SELECT add_months(trunc (to_date('01/01/2012','MM/DD/YYYY'), 'MM'), 1*LEVEL -1) FirstDay
        FROM Dual
     CONNECT BY LEVEL <= MONTHS_BETWEEN(to_date('12/31/2012','MM/DD/YYYY'), to_date('01/01/2012','MM/DD/YYYY')) + 1
       ORDER BY FirstDay) Months

おそらくこれを@startDateパラメーターと@endDateパラメーターを受け入れるsprocでラップして、関心のある日付範囲を定義しますが、構文に従って、日付範囲を文字列で定義しました。

私はこのSqlFiddleを使用してこれで遊んでいました

于 2012-10-23T18:06:30.590 に答える
0

これは、日付ルックアップテーブルの良い使用法かもしれません。私は、それらが適切なサイズのデータ​​ベースに常に1つあるようにするのに十分役立つことを発見しました。

妥当な期間、1日1行でデータベースにテーブルを作成します...たとえば、10年前から10年後まで(実行するクエリの種類によって異なります)。

表に、日付に基づいていくつかのフィールドを追加します。

日付週週_終了月月_日月_開始年ビジネス_日週末の休日など...

これの便利な点は、データが入力されると、日付フィールドで他のテーブルに結合して、必要に応じて日付でデータを要約またはフィルタリングできることです。例えば:

select 
    dt.Month
    count(subscribers) as activeSubscribers 
from subscriberlist sub 
    join (select unique datelookup.Month_Beginning
          from date_reference ) dt
    on dt.Month_Beginning between sub.firstDayOfSubscription and sub.lastDayOfSubscription
group by 
    dt.Month;

(特にOracleの場合、この構文が正確に正しいかどうかはわかりません。)

データベースに追加する機能がない場合は、クエリの一部として一時テーブルを作成し、関係する日付範囲を入力することができます。

于 2012-10-23T18:24:42.143 に答える