5

テーブル内のデータを時間間隔でグループ化したいと考えています。テーブルには、ユーザー ID、アイテム名、モデル、数量、活動日などを含む注文情報が保持されます。このデータを時間間隔でグループ化します。時間間隔は、5 分、10 分、15 などです。また、クエリは、その 5 分間隔内に複数回注文したユーザー (すべての列データ) のみを返す必要があります。1 つの SQL クエリでこれを達成することは可能ですか? オラクルを使用しています。

ありがとうございました

編集:

サンプルデータ

**userid    item name    model      quantity   order date**
abc calculator   cdm83ss    1      02-FEB-2013 09:20:13     
abc alarm clock  actp001    1      02-FEB-2013 09:26:22
yyy iPhone       iP4    1      02-FEB-2013 09:28:14
abc alarm clock  actz321    2      02-FEB-2013 09:30:00
zzz backpack     bp344tk    1      04-FEB-2013 13:15:00
zzz backpack     bp234zz    2      04-FEB-2013 13:19:32
zzz camera       cm234  1      04-FEB-2013 13:20:22 
ttt tv       fs45yup    1      04-FEB-2013 13:28:19

私は得ることを期待しています:

**userid    item name    model      quantity   order date**
abc         calculator   cdm83ss    1      02-FEB-2013 09:20:13     
abc         alarm clock  actp001    1      02-FEB-2013 09:26:22
abc         alarm clock  actz321    2      02-FEB-2013 09:30:00
zzz         backpack     bp344tk    1      04-FEB-2013 13:15:00
zzz         backpack     bp234zz    2      04-FEB-2013 13:19:32
zzz         camera       cm234  1      04-FEB-2013 13:20:22 
4

2 に答える 2

7

はい。おそらく、結果を日時値としても表示したいでしょう。これには、日時演算が必要です。基本的には、午前 0 時からの分数を取得し、その分数で割り、再度掛けます (切り捨てます)。次に、真夜中の時間を追加します。

select t.*
from (select t.*,
             count(*) over (partition by userid, interval) as CntInInterval
      from (select trunc(orderdate)+
                   (floor(((orderdate - trunc(orderdate))*24*60)/10)*10)/(24*60) as interval, t.*
            from t
           ) t
     ) t
where cntInInterval > 1

時間間隔でグループ化するには、次を使用します。

      select interval, count(*)
      from (select trunc(orderdate)+floor(((orderdate - trunc(orderdate))*24*60)/10)*10 as interval, t.*
            from t
           ) t
      group by interval

これらのクエリでは、「10」は任意の分数を表します。これらは午前 0 時から計算されるため、17 のような値は常にその日の最初の 17 分から始まることに注意してください。

interval の定義は、日付の算術式です。

          trunc(orderdate)+floor(((orderdate - trunc(orderdate))*24*60)/10)*10 を間隔として、

最初の部分trunc(orderdate)は、日付の時刻部分を削除するための Oracle 構文です。これにより、日付が 1 日の始まりの真夜中に移動します。

この式orderdate - trunc(orderdate)は、午前 0 時からの日数を計算します。これは 1 日の小数部分です。したがって、0.25 は午前 6:00 になります。 は*24*60これを分に変換します。したがって、0.25 は 0.25*60*24 = 360 になります。つまり、午前 0 時からの分数です。

次に、式floor(x/y)*yは単に任意の値を y の低い倍数に「切り捨て」ます。つまり、これfloor(118/10)は 11 であり、11*10 は 110 です。つまり、これは a*y と (a+1)*y の間のすべての値 (含まないものまで) を同じ値 a*y にマップします。

2013-01-01 の午前 6:08 の実際の式を考えてみます。

`trunc(orderdate)` moves the date to midnight on 2013-01-01.
`orderdate - trunc(orderdate)` creates a number like 0.25.
`((orderdate - trunc(orderdate))*24*60)` produces the value 368
`floor(((orderdate - trunc(orderdate))*24*60)/10)*10` produces 360
`floor(((orderdate - trunc(orderdate))*24*60)/10)*10*(1/24*60)` produces 0.25

そして、これを真夜中に加えると、時間は再び午前6時になります。

于 2013-02-08T21:07:04.960 に答える
3

時間間隔を取得するためのより簡単な方法が必要な場合-テーブルとデータがわからないため、他に何もお手伝いできません。

-- Time interval - every 15 min from midnight --
SELECT To_Char(trunc(SYSDATE) + (LEVEL/1440*15), 'HH24:MI') interval_15_min 
  FROM dual
CONNECT BY LEVEL <= 10 -- this is orbitraty 
/
SQL>

INTERVAL_15_MIN
--------------
00:15
00:30
00:45
...
于 2013-02-08T21:45:19.597 に答える