как получить количество записей в день за последнюю неделю (7 дней) оракул - PullRequest
0 голосов
/ 04 мая 2018

привет, я использую следующий SQL-запрос, чтобы получить записей в час за последние 24 часа :

WITH date_range
  AS (SELECT TRUNC(sysdate - (rownum/24),'HH24') as the_hour
        FROM dual
      CONNECT BY ROWNUM <= 24),
     the_data
  AS (SELECT TRUNC(systemdate, 'HH24')  AS log_date, count(*) AS num_obj
        FROM transactionlog where merchantcode='merc0003'
      GROUP BY TRUNC(systemdate, 'HH24'))   
SELECT TO_CHAR(dr.the_hour,'DD/MM/YYYY HH:MI AM'), NVL(trans_log.num_obj,0)
FROM date_range dr LEFT OUTER JOIN the_data  trans_log
     ON trans_log.log_date =  dr.the_hour
ORDER BY dr.the_hour DESC ;  

Я пытаюсь получить количество записей в день в оракуле за последние 7 дней .. может кто-нибудь подсказать, что я могу сделать, чтобы получить последние 7 дней, изменив вышеуказанный запрос?

Я пытался подписаться, чтобы получить последние 7 дней, но пока ничего не набрал:

WITH date_range
  AS
(SELECT TRUNC(sysdate - (7)) as the_hour
        FROM dual
      CONNECT BY ROWNUM <= 7),
     the_data
  AS (SELECT TRUNC(systemdate, 'HH24')  AS log_date, count(*) AS num_obj
        FROM transactionlog where merchantcode='merc0003'
      GROUP BY TRUNC(systemdate, 'HH24'))   
SELECT TO_CHAR(dr.the_hour,'DD/MM/YYYY HH:MI AM'), NVL(trans_log.num_obj,0)
FROM date_range dr LEFT OUTER JOIN the_data  trans_log
     ON trans_log.log_date =  dr.the_hour
ORDER BY dr.the_hour DESC ; 

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Я удивлен, что ваш первоначальный CTE даже работал. Я не слышал об использовании CONNECT BY вместе с ROWNUM (хотя, покинув Google, я понимаю, что он работает при определенных условиях. Тем не менее, я убежден, что это неправильно). Чтобы получить диапазон дат за последние семь дней, вам понадобится что-то вроде следующего:

WITH date_range AS (
    -- If you want to include today's date, add +1 to the date below
    SELECT TRUNC(SYSDATE - LEVEL) AS the_date
      FROM dual
   CONNECT BY LEVEL <= 7
)

Соедини это с вашим существующим запросом:

WITH date_range AS (
    SELECT TRUNC(SYSDATE - LEVEL) AS the_date
      FROM dual
   CONNECT BY LEVEL <= 7
), the_data AS (
    -- You still had 'HH24' here in the call to TRUNC()!
    SELECT TRUNC(systemdate) AS log_date, count(*) AS num_obj
      FROM transactionlog
     WHERE merchantcode = 'merc0003'
     GROUP BY TRUNC(systemdate)
)
SELECT dr.the_date, COALESCE(trans_log.num_obj, 0)
  FROM date_range dr LEFT JOIN the_data trans_log
    ON dr.the_date = trans_log.log_date
 ORDER BY dr.the_date DESC;

Кстати, вы можете просто использовать псевдонимы для своих CTE; вам не нужно давать им полные имена только для того, чтобы снова их псевдонимы.

0 голосов
/ 04 мая 2018

Ваша ошибка в том, что вы не добавляете дни; вы извлекаете один и тот же день семь раз. Добавьте level (или level - 1, в зависимости от того, что вы хотите) к дню:

SELECT TRUNC(sysdate) - 7 + level AS the_hour
FROM dual
CONNECT BY ROWNUM <= 7
...