आप एक परिकलित अनुक्रमणिका चाहते हैं।
आइए एक टेबल बनाएं:
create table sales(day date, amount real);
और इसे कुछ यादृच्छिक सामग्री से भरें:
insert into sales
select current_date + s.a as day, random()*100 as amount
from generate_series(1,20);
इसे दिन के हिसाब से इंडेक्स करें, यहां कुछ खास नहीं:
create index sales_by_day on sales(day);
एक पंक्ति स्थिति फ़ंक्शन बनाएँ। और भी तरीके हैं, यह सबसे सरल है:
create or replace function sales_pos (date) returns bigint
as 'select count(day) from sales where day <= $1;'
language sql immutable;
जांचें कि क्या यह काम करता है (हालांकि इसे बड़े डेटासेट पर इस तरह न कहें):
select sales_pos(day), day, amount from sales;
sales_pos | day | amount
-----------+------------+----------
1 | 2011-07-08 | 41.6135
2 | 2011-07-09 | 19.0663
3 | 2011-07-10 | 12.3715
..................
अब मुश्किल हिस्सा:sales_pos फ़ंक्शन मानों पर गणना की गई एक और अनुक्रमणिका जोड़ें:
create index sales_by_pos on sales using btree(sales_pos(day));
यहां बताया गया है कि आप इसका उपयोग कैसे करते हैं। 5 आपकी "ऑफ़सेट" है, 10 "सीमा" है:
select * from sales where sales_pos(day) >= 5 and sales_pos(day) < 5+10;
day | amount
------------+---------
2011-07-12 | 94.3042
2011-07-13 | 12.9532
2011-07-14 | 74.7261
...............
यह तेज़ है, क्योंकि जब आप इसे इस तरह कहते हैं, Postgres अनुक्रमणिका से पूर्व-परिकलित मानों का उपयोग करता है:
explain select * from sales
where sales_pos(day) >= 5 and sales_pos(day) < 5+10;
QUERY PLAN
--------------------------------------------------------------------------
Index Scan using sales_by_pos on sales (cost=0.50..8.77 rows=1 width=8)
Index Cond: ((sales_pos(day) >= 5) AND (sales_pos(day) < 15))
आशा है कि यह मदद करता है।