毎日の生産性を示す Oracle 11g SQL レポートを作成する必要があります。24 時間に出荷されたユニット数です。各ピリオドは午前 6 時に開始し、翌日の午前 5 時 59 分に終了します。
この 24 時間の期間を表示するには、どうすれば結果をグループ化できますか? 日ごとにグループ化しようとしましたが、1 日は 00:00 から 23:59 であるため、結果は不正確です。
結果は過去 2 か月分をカバーします。
どうもありがとう。
group by trunc(your_date - 1/4)
オラクルでは日は整数であるため、午前 6 時は 1 日の 0.25 になります。
select
trunc(date + 0.25) as period, count(*) as number
from table
group by trunc(date + 0.25 )
現時点では、試着するオラクルはありません。
さて、計算された日付でグループ化できます。そのため、日付に 6 時間を追加してグループ化すると、技術的に日付が正しくグループ化され、正しい結果が得られます。
テーブルに列などがあると仮定するとunits
、おそらく次のようになります。
SELECT
TRUNC(us.shipping_datetime - 0.25) + 0.25 period_start
, TRUNC(us.shipping_datetime - 0.25) + 1 + (1/24 * 5) + (1/24/60 * 59) period_end
, SUM(us.units) units
FROM units_shipped us
GROUP BY TRUNC(us.shipping_datetime - 0.25)
ORDER BY 1
これは、各日付から単純に 6 時間 (1 日の 0.25) を差し引いたものです。時刻が午前 6 時より前の場合、減算により午前 0 時より前になり、結果の値が切り捨てられると (時刻要素が削除され、午前 0 時の日付が返されます)、前日のグループ内に収まります。
結果:
| PERIOD_START | PERIOD_END | UNITS |
-----------------------------------------------------------------------
| April, 22 2013 06:00:00+0000 | April, 23 2013 05:59:00+0000 | 1 |
| April, 23 2013 06:00:00+0000 | April, 24 2013 05:59:00+0000 | 3 |
| April, 24 2013 06:00:00+0000 | April, 25 2013 05:59:00+0000 | 1 |
SELECT の動的な計算は、結果を読みやすくするためのものです。units
上に列がない場合SUM()
、つまり各行が 1 つの単位を表している場合は、COUNT(*)
代わりに置き換えます。