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