Предполагая, что вы работаете с MySQL 8.0, вы можете использовать внутренний запрос с оконной функцией FIRST_VALUE
, чтобы выбрать временную метку первого посещения в период анализа. Затем во внешнем запросе можно использовать предложение EXISTS
с подзапросом, чтобы проверить, бывал ли текущий посетитель когда-либо ранее в том же парке.
SELECT
x.visits,
x.dateTimeStamp,
x.visitorID,
EXISTS (
SELECT 1 FROM parkVisits WHERE park = x.park AND visitorID = x.visitorID AND dateTimeStamp < x.dateTimeStamp
) returningVisitor
FROM (
SELECT DISTINCT
COUNT(*) OVER (PARTITION BY p.visitorID) visits,
FIRST_VALUE(p.dateTimeStamp) OVER (PARTITION BY p.visitorID ORDER BY p.dateTimeStamp) dateTimeStamp,
p.visitorID,
p.park
FROM parkVisits p
WHERE
p.dateTimeStamp BETWEEN '2019-01-01 00:00:01' AND '2019-01-04 23:59:59'
AND p.park ='Central'
) x
ORDER BY 1 desc, 2
В это дБ скрипка с вашими данными выборки возвращает:
| visits | dateTimeStamp | visitorID | returningVisitor |
| ------ | ------------------- | --------- | ---------------- |
| 2 | 2019-01-02 10:01:00 | 8828 | 0 |
| 1 | 2019-01-02 10:04:00 | 8821 | 1 |
| 1 | 2019-01-04 09:53:00 | 88281 | 0 |
NB. Я думаю, что возвращающийся посетитель - 8821
, а не 8828
, как показано в вашем вопросе.
Если вы используете более раннюю версию MySQL, которая не поддерживает оконные функции, вы можете использовать в подзапросе предложение GROUP BY
, например:
SELECT
x.visits,
x.dateTimeStamp,
x.visitorID,
EXISTS (
SELECT 1 FROM parkVisits WHERE park = x.park AND visitorID = x.visitorID AND dateTimeStamp < x.dateTimeStamp
) returningVisitor
FROM (
SELECT DISTINCT
COUNT(*) visits,
MIN(p.dateTimeStamp) dateTimeStamp,
p.visitorID,
p.park
FROM parkVisits p
WHERE
p.dateTimeStamp BETWEEN '2019-01-01 00:00:01' AND '2019-01-04 23:59:59'
AND p.park ='Central'
GROUP BY p.visitorID, p.park
) x
ORDER BY 1 desc, 2
См. Эта дБ скрипка .