Leider sind die Fensterfunktionen in SQL Server 2005 einfach nicht leistungsfähig genug. Ich würde dies mit einer korrelierten Unterabfrage lösen.
Die korrelierte Unterabfrage zählt, wie oft eine Person den Artikel innerhalb von 14 Tagen nach jedem Kauf gekauft hat (und den ersten Kauf nicht mitgerechnet).
select t.*
from (select t.*,
(select count(*)
from t t2
where t2.personnumber = t.personnumber and
t2.itemnumber = t.itemnumber and
t2.transactionnumber <> t.transactionnumber and
t2.transactiondate >= t.transactiondate and
t2.transactiondate < DATEADD(day, 14, t.transactiondate
) NumWithin14Days
from transactions t
where transactionDate between '2001-01-01' and '2001-03-01'
) t
where NumWithin14Days > 0
Möglicherweise möchten Sie das Zeitlimit auch in die Unterabfrage einfügen.
Ein Index für transactions(personnumber, itemnumber, transactionnumber, itemdate)
könnte dazu beitragen, dass dies viel schneller ausgeführt wird.