У меня есть данные в реальном времени с парковочных счетчиков и вы хотите сравнить текущее состояние парковки с историческими данными. Мои данные содержат парковочные билеты с datetime_start, когда они покупаются, и datetime_stop, когда они больше не полезны.Сравнивать транзакции счетчика с историческими данными
Настоящий SQL работает, но ОЧЕНЬ медленный. Я предполагаю, что я каким-то образом пройти через все данные в несколько раз или некоторые другие вещи могут быть оптимизированы:
(SELECT "parking_meter_id", SUM(CASE WHEN Now() BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) < (
SUM(CASE WHEN Now() - interval '1 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) +
SUM(CASE WHEN Now() - interval '2 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) +
SUM(CASE WHEN Now() - interval '3 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) +
SUM(CASE WHEN Now() - interval '4 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) +
SUM(CASE WHEN Now() - interval '5 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) +
SUM(CASE WHEN Now() - interval '6 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) +
SUM(CASE WHEN Now() - interval '7 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) +
SUM(CASE WHEN Now() - interval '8 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END)
/8) AS available
FROM "parking_meter_transactions"
WHERE
Now() BETWEEN "datetime_start" AND "datetime_stop" OR
Now() - interval '1 week' BETWEEN "datetime_start" AND "datetime_stop" OR
Now() - interval '2 week' BETWEEN "datetime_start" AND "datetime_stop" OR
Now() - interval '3 week' BETWEEN "datetime_start" AND "datetime_stop" OR
Now() - interval '4 week' BETWEEN "datetime_start" AND "datetime_stop" OR
Now() - interval '5 week' BETWEEN "datetime_start" AND "datetime_stop" OR
Now() - interval '6 week' BETWEEN "datetime_start" AND "datetime_stop" OR
Now() - interval '7 week' BETWEEN "datetime_start" AND "datetime_stop" OR
Now() - interval '8 week' BETWEEN "datetime_start" AND "datetime_stop"
GROUP BY "parking_meter_id") AS transactions
Основная идея заключается в том, чтобы подсчитать количество билетов, которые являются «законными», как сейчас(), и сравнить он с суммами за последние 8 недель в одно и то же время суток. Это может дать статистическое представление о том, должно ли быть место для парковки.
Почему предложение WHERE охватывает 16 недель вместо 8? –
У вас есть datetime_start и datetime_stop все в двойных кавычках (vs single). Возможно, было бы лучше показать образец ваших данных, отредактировав исходный вопрос ... и использовать пробелы или вкладки для удобства чтения. – DRapp
@DRapp: Идентификаторы, такие как имена столбцов, принимают либо двойные кавычки, либо вообще не кавычки. Они не принимают одинарные кавычки. –