Как рассчитать разницу между двумя значениями в разных строках на основе дат в одной таблице - PullRequest
0 голосов
/ 17 апреля 2019

У меня таблица Oracle структурирована следующим образом:

Serial Some_value  Date(Date Field type)

1      100         4-10-2019 8:00

1      106         4-17-2019 7:00

2      100         4-10-2019 8:00

2      101         4-17-2019 6:33

3      100         4-10-2019 9:00

3      110         4-17-2019 6:00

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

Serial Difference

1      6

3      10

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

  (select quantity from Parts where date > sysdate-1) -
  (select quantity from Parts where to_char(sysdate-7,'DDD') = 
   to_char(date,'DDD') and 
   to_char(sysdate-7,'YYYY') = to_char(date,'YYYY') and
   to_char(sysdate-7,'MM') = to_char(date,'MM'))

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Вы можете сделать это, как показано ниже:

select * 
  from (
    select serial, 
           min(case when trunc(date_) = trunc(sysdate) then quantity end) 
         - min(case when trunc(date_) = trunc(sysdate - 7) then quantity end) diff
      from parts 
      where trunc(date_) in (trunc(sysdate), trunc(sysdate-7))
      group by serial)
  where diff > 5

или использовать предложение having, если вы не хотите подзапрос.

демо

0 голосов
/ 17 апреля 2019

Мы можем попробовать использовать функцию LAG здесь:

WITH cte AS (
    SELECT Serial, Some_value, "Date",
        LAG(Some_value, 1) OVER (PARTITION BY Serial ORDER BY "Date") Some_value_lag
    FROM Parts
)

SELECT
    Serial,
    "Date",
    ABS(Some_value - Some_value_lag) AS difference
FROM cte
WHERE
    ABS(Some_value - Some_value_lag) > 5
ORDER BY
    Serial,
    "Date";

enter image description here

Демо

CTE выше сначала генерирует задержку столбца Some_value по дате в каждой группе последовательных записей. Затем мы просим включить только записи, для которых абсолютная разница между некоторыми значениями превышает 5. Обратите внимание, что самая ранняя запись в каждой последовательной группе автоматически не будет включена в набор результатов, поскольку LAG вернет NULL в этом дело. Я пошел дальше и включил дату в вывод, потому что это облегчает чтение.

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