3

以下は私自身の練習です:

次のように、いくつかの値を持つテーブルを作成しました。

CREATE TABLE my_test AS
SELECT ROWNUM ID, TRUNC(SYSDATE)+(LEVEL*5/24/60/60)date_time , 111 person_id
FROM dual CONNECT BY LEVEL <= (24*60*60)/5 
ORDER BY 1;

ここで、とperson_id = 222date_time間のテーブルを更新しました5:30 am6:30 am

UPDATE my_test
SET  person_id   = 222
WHERE date_time >= trunc(SYSDATE)+ 5/24 + 30/24/60
 AND DATE_TIME  <= trunc(sysdate)+ 6/24 + 30/24/60;

各時間の人数を取得する必要があるため、次のようなコードを記述しました。

SELECT time_range,count(distinct person_id) PERSON_COUNT
FROM (
select person_id , date_time,
case TO_CHAR(date_time,'hh24') when '00' then '12 AM - 01 AM' 
             when '01' then '01 AM - 02 AM'
             when '02' then '02 AM - 03 AM'
             when '03' then '03 AM - 04 AM'
             when '04' then '04 AM - 05 AM'
             when '05' then '05 AM - 06 AM'
             when '06' then '06 AM - 07 AM'
             when '07' then '07 AM - 08 AM'
             when '08' then '08 AM - 09 AM'
             when '09' then '09 AM - 10 AM'
             when '10' then '10 AM - 11 AM'
             when '11' then '11 AM - 12 PM'
             when '12' then '12 PM - 01 PM'
             when '13' then '01 PM - 02 PM'
             when '14' then '02 PM - 03 PM'
             when '15' then '03 PM - 04 PM'
             when '16' then '04 PM - 05 PM'
             when '17' then '05 PM - 06 PM'
             when '18' then '06 PM - 07 PM'
             when '19' then '07 PM - 08 PM'
             when '20' then '08 PM - 09 PM'
             when '21' then '09 PM - 10 PM'
             when '22' then '10 PM - 11 PM'
             WHEN '23' THEN '11 PM - 12 AM' end time_range
FROM my_test
WHERE date_time >= trunc(SYSDATE)
AND date_time < trunc(SYSDATE)+1
ORDER BY date_time)
GROUP BY time_range;

予想される順序なしで正常に動作します。( time_range による順序は、外側のクエリの文字列であるため、期待されるものではありません)。

私は time_range で注文する必要があり、上記のシンプルで簡単なコードは大歓迎です。前もって感謝します。

4

3 に答える 3

2

ORDER BY句は常に単一のクエリで最後に解釈されますが、ここではサブクエリにあるため、メインクエリがGROUP BYあなたのORDER BY.

たとえば、次のように書くことができます。

SELECT time_range, COUNT(DISTINCT person_id) PERSON_COUNT
  FROM (SELECT person_id,
               date_time,
               CASE TO_CHAR(date_time, 'hh24')
                  WHEN '00' THEN
                   '12 AM - 01 AM'
               /*[snip]*/
                  WHEN '23' THEN
                   '11 PM - 12 AM'
               END time_range
          FROM my_test
         WHERE date_time >= trunc(SYSDATE)
           AND date_time < trunc(SYSDATE) + 1)
 GROUP BY time_range, TO_CHAR(date_time, 'hh24')
 ORDER BY TO_CHAR(date_time, 'hh24');

また、私はあなたのtime_range表現のファンではありません。次のように簡単に書き直すことができます。

to_char(date_time, 'HH PM - ') || to_char(date_time + 1/24, 'HH PM') time_range

編集:明らかに完全なクエリが必要です:

SELECT time_range, COUNT(DISTINCT person_id) PERSON_COUNT
  FROM (SELECT person_id,
               date_time,
               to_char(date_time, 'HH PM - ') 
               || to_char(date_time + 1/24, 'HH PM')  time_range
          FROM my_test
         WHERE date_time >= trunc(SYSDATE)
           AND date_time < trunc(SYSDATE) + 1)
 GROUP BY time_range, TO_CHAR(date_time, 'hh24')
 ORDER BY TO_CHAR(date_time, 'hh24');
于 2013-09-11T11:15:42.670 に答える
1

まず、内側のクエリではなく order by外側のクエリに を含める必要があります。order by通常、内部クエリでの動作は保証されていません。

しかし、たとえあなたが入れても:

order by date_time;

結局、あなたはまだあなたが望むものを手に入れません。そのためには、次のように、date_timeそれ自体で注文してみてください。

order by max(date_time);

サブクエリに関するOracle ドキュメントの例を次に示します。order by

ORDER BY 句を使用すると、結果セットに表示される行の順序を指定できます。サブクエリでは、ORDER BY 句は、結果オフセット句と最初のフェッチ句のいずれかまたは両方を伴うか、ROW_NUMBER 関数と組み合わせて使用​​しない限り、意味がありません。これは、順序が外部の結果セットで保持されるという保証がないためです。外部クエリの ORDER BY とサブクエリの ORDER BY を組み合わせることは許可されています。

于 2013-09-11T11:14:13.300 に答える
0
select case TO_CHAR(date_time,'hh24') when '00' then '12 AM - 01 AM' 
         when '01' then '01 AM - 02 AM'
         when '02' then '02 AM - 03 AM'
         when '03' then '03 AM - 04 AM'
         when '04' then '04 AM - 05 AM'
         when '05' then '05 AM - 06 AM'
         when '06' then '06 AM - 07 AM'
         when '07' then '07 AM - 08 AM'
         when '08' then '08 AM - 09 AM'
         when '09' then '09 AM - 10 AM'
         when '10' then '10 AM - 11 AM'
         when '11' then '11 AM - 12 PM'
         when '12' then '12 PM - 01 PM'
         when '13' then '01 PM - 02 PM'
         when '14' then '02 PM - 03 PM'
         when '15' then '03 PM - 04 PM'
         when '16' then '04 PM - 05 PM'
         when '17' then '05 PM - 06 PM'
         when '18' then '06 PM - 07 PM'
         when '19' then '07 PM - 08 PM'
         when '20' then '08 PM - 09 PM'
         when '21' then '09 PM - 10 PM'
         when '22' then '10 PM - 11 PM'
         WHEN '23' THEN '11 PM - 12 AM' end time_range,
count(person_id) person_count
FROM my_test
WHERE date_time >= trunc(SYSDATE)
AND date_time < trunc(SYSDATE)+1 
group by TO_CHAR(date_time,'hh24')
ORDER BY 1
于 2013-09-11T11:24:52.177 に答える