Моя таблица состоит из двух полей: CalDay
поле отметки времени с временем, установленным на 00:00:00 и UserID
.Вместе они образуют составной ключ, но важно иметь в виду, что у нас есть много строк для каждого данного календарного дня и не существует фиксированного количества строк для данного дня.
На основании этого набора данных мне понадобитсячтобы подсчитать, сколько разных пользователей существует за определенный промежуток времени, скажем, 30d.
Использование postgres 9.3 Я не могу использовать COUNT(Distinct UserID) OVER ...
и не могу обойти проблему, используя DENSE_RANK() OVER (... RANGE BETWEEN)
, потому что RANGE
принимает толькоUNBOUNDED
.
Итак, я пошел по старинке и попробовал скалярный подзапрос:
SELECT
xx.*
,(
SELECT COUNT(DISTINCT UserID)
FROM data_table AS yy
WHERE yy.CalDay BETWEEN xx.CalDay - interval '30 days' AND xx.u_ts
) as rolling_count
FROM data_table AS xx
ORDER BY yy.CalDay
Теоретически это должно сработать, верно?Я еще не уверен, потому что я начал запрос около 20 минут назад, и он все еще выполняется.В этом и заключается проблема: набор данных все еще относительно мал (25000 строк), но со временем будет расти.Мне нужно что-то, что масштабируется и работает лучше.
Я думал, что, может быть - просто возможно - использование эпохи Unix вместо метки времени может помочь, но это только дикое предположение.Любое предложение будет приветствоваться.