def filterdup(items):
c = Counter()
for item in items:
if c[item] == 1:
yield item
c[item] += 1
в виде хранимой процедуры со стеком
мало подходит такое решение, т.к. нужно на лету считать и быстро, а данных много
active_from <= :qdate
AND (
active_to IS NULL
OR active_to > :qdate
)