SQL В Oracle - Как искать вхождения в интервале? - PullRequest
0 голосов
/ 25 апреля 2020

Я застрял, работая в Oracle с SQL в первый раз. В моем примере с библиотекой мне нужно сделать запрос к моим таблицам для члена библиотеки, который за прошлый год одолжил более 5 книг за неделю. Вот моя попытка:

SELECT 
PN.F_NAME,
PN.L_NAME,
M.ENROLL_DATE,
COUNT(*) AS BORROWED_COUNT,
(SELECT 
    (BD.DATE_BORROWED + INTERVAL '7' DAY)
    FROM DUAL, BORROW_DETAILS BD 
    GROUP BY BD.DATE_BORROWED + INTERVAL '7' DAY
    HAVING COUNT(*) > 5
) AS VALID_INTERVALS
FROM PERSON_NAME PN, BORROW_DETAILS BD, HAS H, MEMBER M
WHERE 
    PN.PID = M.PID AND
    M.PID = BD.PID AND
    BD.BORROWID = H.BORROWID

GROUP BY PN.F_NAME, PN.L_NAME, M.ENROLL_DATE, DATEDIFF(DAY, BD.DATE_RETURNED, VALID_INTERVALS)
ORDER BY BORROWED_COUNT DESC;

Как я уверен, вы можете сказать, я действительно борюсь с датами в oracle. По какой-то причине DATEDIFF вообще не работает для меня, и я не могу найти какой-либо способ оценить VALID_INTERVAL, который должен быть другой датой ...

Также извиняюсь за все заглавные буквы.

1 Ответ

2 голосов
/ 26 апреля 2020

DATEDIFF не является допустимой функцией в Oracle; если вы хотите разницу, то вычтите одну дату из другой, и вы получите число, представляющее число дней (или их долю) между значениями.

Если вы хотите считать ее за неделю, начиная с полуночи В понедельник вы можете TRUNC съесть дату до начала недели ISO (которая будет Полночь понедельника этой недели), а затем сгруппировать и считать:

SELECT MAX( PN.F_NAME ) AS F_NAME,
       MAX( PN.L_NAME ) AS L_NAME,
       MAX( M.ENROLL_DATE ) AS ENROLL_DATE,
       TRUNC( BD.DATE_BORROWED, 'IW' ) AS monday_of_iso_week,
       COUNT(*) AS BORROWED_COUNT
FROM   PERSON_NAME PN
       INNER JOIN MEMBER M
       ON ( PN.PID = M.PID )
       INNER JOIN BORROW_DETAILS BD
       ON ( M.PID = BD.PID )
GROUP BY
       PN.PID,
       TRUNC( BD.DATE_BORROWED, 'IW' )
HAVING COUNT(*) > 5
ORDER BY BORROWED_COUNT DESC;

дБ <> fiddle

Вы не указали структуры таблиц или примерные данные, поэтому их сложно протестировать; но вам, кажется, нет необходимости включать таблицу HAS, и я предполагаю, что между человеком и участником существует соотношение 1: 1.

Вы также не хотите GROUP BY имен как может быть два человека с одинаковыми именем и фамилией (которые записались на одну и ту же дату) и должны использовать что-то, что однозначно идентифицирует человека (я предполагаю, что это PID).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...