0

We have a dataset that looks like this:

ID       eventType     date
--------------------------------
1        foo           2 March 2013
2        foo           3 March 2013
3        bar           3 March 2013
4        foo           5 March 2013
5        foo           6 March 2013
6        bar           7 March 2013
7        baz           8 March 2013

I can easily get the unique list of eventTypes from this list. However, how do I query the count of which eventTypes first appeared BETWEEN startDate and endDate. I want to be able to have a date range from 7 March 2013 - 10 March 2013 and get a count returned of 1 since baz value was a newly occurring eventType during the date range. On the other hand, a date range of 5 March 2013 - 7 March 2013 would return a count of 0 since no newly occurring eventTypes appeared in that range.

4

4 に答える 4

1

これはあなたのために働くはずだと思います。基本的に、テーブルをそれ自体に対して結合します。

SELECT COUNT(DISTINCT T.EventType)
FROM YourTable T
   LEFT JOIN YourTable T2 ON T.eventType = T2.eventType AND T2.dateField < to_date('2013-03-07','yyyy-mm-dd')
WHERE T.DateField BETWEEN to_date('2013-03-07','yyyy-mm-dd') 
  AND to_date('2013-03-10','yyyy-mm-dd')
       AND T2.Id IS NULL

そして、これがSQLFiddleです。

- 編集

@JoachimIsakssonが正しく指摘しているように、同じように簡単に(そしておそらくできれば)次のように変更できますLEFT JOIN

   LEFT JOIN YourTable T2 ON T.eventType = T2.eventType AND T2.dateField < T.dateField

幸運を。

于 2013-02-06T18:55:13.460 に答える
1

このような何かがトリックを行う必要があります:

SELECT COUNT(DISTINCT eventType)
FROM YOUR_TABLE T1
WHERE
    date BETWEEN :startDate AND :endDate
    AND NOT EXISTS (
        SELECT *
        FROM YOUR_TABLE T2
        WHERE T1.eventType = T2.eventType AND T2.date < :startDate
    )

平易な英語で:

  • eventType指定された日付より前にすでに存在するすべての行を除外します。
  • そして、与えられた日付範囲に残っているものの明確な出現を数えるだけです。

同じことを表現する別の方法は、マイナスを使用することです。

SELECT COUNT(*)
FROM (
  SELECT eventType
  FROM your_table
  WHERE date BETWEEN :startDate AND :endDate
  MINUS
  SELECT eventType
  FROM your_table
  WHERE date < :startDate
);

注:この場合、MINUSはDISTINCTを意味するため、COUNT(DISTINCT)は必要ありません。つまり、MINUSの左側は一意のエントリのみを返します。

于 2013-02-06T19:20:54.003 に答える
1

MIN集計関数を使用して、クエリの終了日の前に発生するイベントタイプの最も早いものを見つけることを検討します。次に、範囲の開始日以降に最も早いイベントがあったかどうかを確認します。

SELECT event_type, date_value
from (
  SELECT event_type, min(date_value) as date_value
  from your_table
  where date_value <= date '2013-03-10'
  group by event_type
)
where date_value >= date '2013-03-07'
于 2013-02-06T21:08:33.560 に答える
0

私はあなたのデータと質問を完全には理解していませんが、分析関数を使用して、データを/range_betweenとイベントタイプの間の日付で分割することができると思います。次に、パーティションにrownum()またはrank()/density_rank()があります。これがシーケンスになります。最も低いシーケンス。多分あなたの答え。

于 2013-02-06T19:17:14.307 に答える