SQL с использованием подзапроса select для диапазона дат в операторе where для определения максимального значения в этом диапазоне дат - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь получить максимальное значение для пользователя в течение определенного периода времени.Диапазон дат определяется первым появлением каждого пользователя в отдельном временном диапазоне и за 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?

1 Ответ

0 голосов
/ 25 октября 2018

Если я правильно понимаю, вы можете использовать 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;
...