SQL с использованием подзапроса select для диапазона дат в операторе where для определения максимального значения в этом диапазоне дат

Я пытаюсь получить максимальное значение на пользователя в течение определенного периода времени. Диапазон дат определяется первым появлением каждого пользователя в отдельном временном диапазоне и за 2 недели до этого, то есть первый раз, когда пользователь появляется в октябре, - 2018-10-01, поэтому диапазон - с 2018-09-18. до 2018-10-01. В этом диапазоне я ищу максимальное значение столбца. Все эти данные поступают из одной таблицы.

Пример:

+------------+------------+---------+
| Profile_ID |    Date    | Value   |
+------------+------------+---------+
|          1 | 2018-10-05 |    100  |
|          2 | 2018-10-02 |     50  |
|          2 | 2018-10-04 |     78  |
|          2 | 2018-10-05 |     56  |
|          1 | 2018-10-08 |    110  |
|          1 | 2018-10-01 |     99  |
|          2 | 2018-09-30 |     88  |
|          1 | 2018-09-27 |    106  |
+------------+------------+---------+

Я ищу пиковое значение VALUE за две недели до и включая первое вхождение после 1 октября. Это будет 2018-10-01 для пользователя 1 и 2018-10-02 для пользователя 2. Тогда пиковое значение будет 106 и 88 соответственно.

Я пытался код:

SELECT max(Value)
FROM table
WHERE Date BETWEEN (
  SELECT (min(Date) - INTERVAL 2 week)
  FROM table
  WHERE stamp between '2018-10-01' AND '2018-10-25'
  GROUP BY profile_id
  )
  AND
  (
  SELECT min(Date)
  FROM table
  WHERE stamp between '2018-10-01' AND '2018-10-25'
  GROUP BY profile_id
  )

Я получаю ошибку:

Синтаксическая ошибка: около или около "2"

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

2 ответа

Если я правильно понимаю, вы можете использовать row_number() и некоторая фильтрация даты:

select t.*
from (select t.*,
             row_number() over (partition by profile_id order by date desc) as seqnum
      from t
      where date <= '2018-10-01'
     ) t
where seqnum = 1;

Вы всегда можете присоединиться к сгруппированным данным:

SELECT yourdata.Profile_ID, MAX(Value)
FROM yourdata
INNER JOIN (
    SELECT Profile_ID, MIN(Date) AS MaxDate, MIN(Date) - INTERVAL '13' DAY AS MinDate
    FROM yourdata
    WHERE Date >= '2018-10-01'
    GROUP BY Profile_ID
) AS gd ON yourdata.Profile_ID = gd.Profile_ID AND yourdata.Date BETWEEN gd.MinDate AND gd.MaxDate
GROUP BY yourdata.Profile_ID

DB Fiddle

Другие вопросы по тегам