Как выбрать данные, но без одинакового времени? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть таблица с временами create_dt, и мне нужно получить записи, но без данных, которые имеют аналогичное время create_dt (15 минут).

Так что мне нужно получить только одну запись вместо двух записей, если create_dt находится в 15 минутах от первой.

Формат даты и времени '(29.03.2019 00:00:00','DD.MM.YYYY HH24:MI:SS').Спасибо

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Немного неясно, что именно вы хотите, но я могу подумать лишь об одном: округлить все значения до ближайших 15 минут, а затем выбрать только одну строку из этих 15-минутных интервалов:

with rounded as (
  select create_dt, 
         date '0001-01-01' + (round((cast(create_dt as date) - date '0001-01-01') * 24 * 60 / 15) * 15 / 60 / 24) as rounded, 
         ... other columns ....
  from your_table
), numbered as (
  select create_dt,
         rounded,
         row_number() over (partition by rounded order by create_dt) as rn
         ... other columns ....
  from rounded
)
select *
from numbered
where rn = 1;

Выражение date '0001-01-01' + (round((cast(create_dt as date) - date '0001-01-01') * 24 * 60 / 15) * 15 / 60 / 24) вернет create_dt с округлением в большую или меньшую сторону до следующего интервала «15 минут».

Затем row_number() присваивает уникальные номера для каждого отдельного 15-минутного интервала, и при окончательном выборе всегда выбирается первая строка для этого интервала.

Онлайн пример: https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=e6c7ea651c26a6f07ccb961185652de7

0 голосов
/ 29 марта 2019

Я собираюсь провести вас через это концептуально.Прежде всего, в этом есть сложность, которую вы, возможно, не заметили.

Допустим, вы хотели одну запись за один час или день.Но если две записи созданы в один и тот же день, вам нужна только одна запись в ваших результатах.Какой из них?

Я упоминаю об этом, потому что разработчикам SQL нет единого ответа, который они могут предоставить для выбора.Затем невозможно отобразить данные из обеих записей без того, чтобы обе записи находились в табличном выводе.

Это распространенная проблема, но когда разработчики SQL предоставили функцию для ее обработки, она может работать только при отсутствии двусмысленностио том, как иметь один ряд результата для двух записей.Это решение GROUP BY, но оно работает только для отображения полей, отличных от отметки времени, если они одинаковы для всех записей, соответствующих периоду времени.Вы должны включить все поля в предложение select, и если несколько записей в вашем периоде времени одинаковы, они создадут несколько записей в вашем выводе.Поэтому, хотя для этой проблемы есть инструмент GROUP BY, вы не сможете его использовать.

Так что вот решение, которое вы хотите.Если несколько записей расположены близко друг к другу, не включайте записи после первой.Таким образом, вы хотите предложение WHERE, которое исключит запись, если другая запись недавно обработает ее.Таким образом, проверка для каждой записи в результате будет включать других записей в таблице.Вам необходимо присоединить таблицу к самой .

Допустим, у нас есть таблица с именем error_events.Если мы получим кратные значения одного и того же значения в поле error_type очень близко ко времени других похожих событий, мы хотим видеть только первое.SQL будет выглядеть примерно так:

SELECT A.*
FROM error_events A
  INNER JOIN error_events B ON A.error_type = B.error_type
WHERE ???

Вам нужно будет выяснить детали предложения WHERE, и функции для метки времени будут зависеть от вас, когда вы используете продукт RDBMS.(Например, mysql и postgres могут работать по-разному.)

Вам нужны только те записи, в которых нет записи, которая раньше, чем на 15 минут.Вы действительно хотите оригинальную запись.Эта запись будет соответствовать сама по себе в соединении, но это будет единственная запись за период между ее отметкой времени и 15 минутами ранее.

Таким образом, пример WHERE предложения будет

WHERE B.create_dt BETWEEN [15 minutes before A.create_dt] and A.create_dt
GROUP BY A.*
HAVING 1 = COUNT(B.pkey)

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

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