ВЫБЕРИТЕ первую дату, в которой 3 последовательные записи находятся между двумя датами

#mysql #date #select #subquery #mariadb-10.2

#mysql #Дата #выберите #подзапрос #mariadb-10.2

Вопрос:

Я хотел бы знать первую дату первых 3 последовательных записей, которые находятся между двумя датами. Основываясь на моем SQLFiddle, я бы ожидал, что результат будет «2021-01-24».

Я просмотрел много примеров, но не могу заставить их работать.

Этот запрос работает не так, как я хочу, я не могу найти недостающую часть моего запроса. Вот SQLFIDDLE: http://sqlfiddle.com /#!9/935fbd/1

 SELECT DISTINCT
    logDate
FROM
    FoodLog
WHERE
    studentID = '1329' AND logDate BETWEEN '2021-01-01' AND '2021-05-01'
GROUP BY
    logDate
HAVING
    COUNT(logDate) = 3
 

Я пытался работать со следующим, но не могу понять, как ограничить поиск StudentID = ‘1329’ или моим диапазоном дат:

 SELECT DISTINCT
    f.id,
    f.logDate
FROM
    FoodLog f,
    (
    SELECT
        f1.logDate START,
        f2.logDate NEXT
    FROM
        FoodLog f1,
        FoodLog f2
    WHERE
        f2.logDate <= DATE_ADD(f1.logDate, INTERVAL 1 DAY) AND f2.logDate > f1.logDate
) f2
WHERE
    f.logDate = f2.start OR(
        f.logDate = f2.next AND f2.start IS NOT NULL
    )
LIMIT 1
 

Комментарии:

1. Используете ли вы 8.x, чтобы вы могли использовать оконные функции?

2. @Barmar — Версия сервера: 10.2.34-MariaDB-cll-lve — Сервер MariaDB, версия протокола: 10

3. Я хотел бы знать первую дату первых 3 последовательных записей, которые находятся между двумя датами. Должны ли все 3 даты находиться в диапазоне или только возвращаемая дата?

4. @Akina Все 3 даты должны быть последовательными и между двумя датами. Мне нужно вернуть первую дату, которая начинает серию из 3. Надеюсь, я ответил на ваш вопрос

5. Оконные функции были добавлены в 10.2, поэтому вы должны иметь возможность их использовать.

Ответ №1:

 WITH
cte1 AS ( 
    SELECT DISTINCT logDate
    FROM FoodLog
    WHERE logDate BETWEEN '2021-01-01' AND '2021-05-01'),
cte2 AS (
    SELECT logDate, LEAD(logDate, 2) OVER (ORDER BY logDate) next2date
    FROM cte1
)
SELECT MIN(logDate) logDate 
FROM cte2 
WHERE DATEDIFF(next2date, logDate) = 2;
 

скрипка