Запрос Sql для возврата данных, если AVG (количество записей за 7 дней)> (Количество записей за сегодня) - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу написать запрос SQL в База данных Oracle для:

Индекс цены (имя поля) имеет около 120 (скажем) записей каждый день, и мне нужно отобразить имя индекса ценыи сегодняшнюю дату, если среднее число записей за последние 7 дней больше, чем число записей сегодня для индекса цены (сгруппировать по индексу цены).

По сути, будет 56 indexindex, и каждый должен иметь около 120 записей каждый день и ежедневно выгружать в базу данных с внешнего сайта.Поэтому я хочу, чтобы все записи ежедневно загружались в базу данных.

1 Ответ

0 голосов
/ 17 декабря 2018

За исключением пояснения, которое я запросил в комментарии к вашему вопросу (касающегося того, «как мы можем узнать сегодняшний итоговый счет сегодня, когда сегодня еще не закончился), проблема может быть решена по следующим направлениям.Вы не предоставили пример данных.

В своей таблице выберите только те строки, в которых соответствующая ДАТА находится между «сегодня» - 7 и «сегодня» (так что на самом деле есть восемь дней: семь дней, предшествующих сегодня, и сегодня). Затем сгруппируйте по PRICEINDEX. Подсчитайте общее количество строк для каждой группы и подсчитайте количество строк только для слова «сегодня». Число строк для слова «сегодня» должно быть менее чем в 1/8 от общего числа (это простая алгебра:эквивалентно тому, чтобы быть в 1/7 раза меньше числа ДРУГИХ дней).

Такие условия на уровне группы должны быть указаны в предложении HAVING.

select   priceindex
from     your_table
where    datefield >= trunc(sysdate) - 7 and datefield < trunc(sysdate) + 1
group by priceindex
having   count(case when datefield >= trunc(sysdate) then 1 end) < 1/8 * count(*)
;

РЕДАКТИРОВАТЬ ОП пояснил, что запрос выполняется каждый день в полночь, это означает, что «сегодня» должен фактически означать «вчера» (день, который только что закончился). В Oracle, и, вероятно, во всехвычисление, полночь относится к дню, который начинается в полночь, а не к концу, который заканчивается в полночь.Время дня в полночь - 00:00:00 (начало нового дня), а не 24: 00: 00.

Таким образом, приведенный выше запрос нужно будет немного изменить:

select   priceindex
from     your_table
where    datefield >= trunc(sysdate) - 8 and datefield < trunc(sysdate)
group by priceindex
having   count(case when datefield >= trunc(sysdate) - 1 then 1 end)
         < 1/8 * count(*)
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...