Попытка получить положительную или отрицательную разницу в окне в запросе postgresql - PullRequest
1 голос
/ 21 апреля 2019

У меня есть таблица, daily, следующая:

|date|high|low|

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

SELECT date, high, low, (high - low) AS diff
FROM (
  SELECT dd.date AS date,
    MAX(dd.high)
      OVER(ORDER BY dd.date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS high,
    MIN(dd.low)
      OVER(ORDER BY dd.date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS low
  FROM daily dd
) AS win
ORDER BY date

Однако этот запрос неверен, поскольку результат всегда будет положительным.Если максимум произошел до минимума, результат должен быть отрицательным.Есть ли способ сделать это с помощью запроса?

РЕДАКТИРОВАТЬ: Добавление примеров и ожидаемый результат

РЕДАКТИРОВАНИЕ2: Изменено с лучшим примером

|date      |high|low|
|01-01-2001|20  |10 |
|01-02-2001|30  |20 |
|01-03-2001|40  |30 |
|01-04-2001|30  |25 |
|01-05-2001|35  |25 |

Результат за 5 днейдолжно быть:

|date      |high|low|diff|
|01-01-2001|20  |10 |10  |
|01-02-2001|30  |10 |20  |
|01-03-2001|40  |10 |30  |
|01-04-2001|40  |10 |30  |
|01-05-2001|40  |10 |30  |

Результат за 3 дня должен быть:

|01-01-2001|20  |10 |10  |
|01-02-2001|30  |10 |20  |
|01-03-2001|40  |10 |10  |
|01-04-2001|40  |20 |20  |
|01-05-2001|40  |25 |-15 |

1 Ответ

1 голос
/ 21 апреля 2019

Вы можете попытаться использовать подзапрос, чтобы получить самое высокое и самое низкое значение из таблицы за день.затем выполните SELF JOIN с CASE WHEN

CREATE TABLE daily(
    date date,
    high int,
    low int
);


INSERT INTO daily VALUES ('01-01-2001',40 ,30);
INSERT INTO daily VALUES ('01-02-2001',30 ,25);
INSERT INTO daily VALUES ('01-03-2001',35 ,25);
INSERT INTO daily VALUES ('01-04-2001',20 ,10);
INSERT INTO daily VALUES ('01-05-2001',30 ,20);

Запрос № 1

SELECT  t1.*,
        CASE WHEN highdt.date > lowdt.date 
           THEN highest - lowest 
           ELSE lowest - highest 
        END diff
FROM (
  select MAX(date) dates,
         MAX(high) highest,
         MIN(low)  lowest
  from daily
) t1
JOIN  daily highdt ON t1.highest = highdt.high
JOIN  daily lowdt ON t1.lowest = lowdt.low;

| dates                    | highest | lowest | diff |
| ------------------------ | ------- | ------ | ---- |
| 2001-01-05T00:00:00.000Z | 40      | 10     | -30  |

Просмотр на БД Fiddle

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