2013-09-11 2 views
3

Ниже практика для себя:Oracle запрос для временного диапазона

Я создал таблицу с некоторыми значениями, как:

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 = 222 для date_time между 5:30 am и 6: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; 

Его рабочий штраф без ожидаемого заказа. (Порядок by time_range не дает ожидаемого, поскольку он является строкой во внешнем запросе).

Мне нужно заказывать по времени, и любые простые и простые коды для вышеуказанного оцениваются. Спасибо заранее.

ответ

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 

Edit: видимо, вам нужен полный запрос:

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'); 
+0

wow. Это так просто. Ive используется: 'SELECT COUNT (DISTINCT person_id), промежуток_времени ОТ (SELECT дата_время, person_id, TO_CHAR (дата_время, 'HH ПМ -') || TO_CHAR (дата_время + 1/24, 'HH ПМ') TIME_RANGE FROM my_test ) GROUP BY time_range; 'но все же порядок не выполняется в этой логике – ajmalmhd04

+1

Вам нужно предложение' ORDER BY'. Заказ не делается магией. –

+1

вы можете видеть, что 'ORDER BY' не повлияет на вышеупомянутый комментарий, который я использовал, т.е. согласно вашему второму более простому запросу. Пожалуйста, проверь это. – ajmalmhd04

1

Во-первых, вы должны иметь order by в внешнем запросе вместо внутреннего запроса. order by во внутренних запросах, как правило, не гарантируется.

Но, даже если вы поставите:

order by date_time; 

в конце концов, вы все равно не получите то, что вы хотите. Для этого, попробуйте заказ на date_time себя, как:

order by max(date_time); 

Вот пример Oracle documentation на order by в подзапросов:

заказ по п позволяет определить порядок, в котором строки отображаются в результирующем наборе. В подзапросах предложение ORDER BY равно , если оно не сопровождается одним или обоими результатами смещение и выборка первых предложений или совместно с функцией ROW_NUMBER , так как нет гарантии, что порядок сохранен в внешним результат набор. Допускается комбинировать ORDER BY на внешнем запросе с ORDER BY в подзапросах.

+0

Спасибо за информацию о подзапросах, но я ищу для заказа внешнего запроса в указанном 'time_range' – ajmalmhd04

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 
+0

Спасибо, за информацию об использовании 'group by' its, исправьте, но вам нужно вместо этого использовать' count (different person_id) '. и в любом случае у меня есть более простой запрос от @Vincent – ajmalmhd04

Смежные вопросы