Technical Article

Implementing Most Recently Used Lookups

,

How many times have you had to scroll through 267 country names to get to the "United States" in a list box? We constantly force our users to do unnecessary work when it would be a breeze for us to implement adaptive lists ordered by most commonly selected foreign key values or by most recently selected foreign key values.

Copy the attached script into a query window and play with it if you want to get a feel for how easy it is to implement this feature.

-- This script demonstrates adaptive sorting of lookup lists

declare @SortMethod varchar(20)
set @SortMethod = 'MostCommonlyUsed'
set @SortMethod = 'MostRecentlyUsed'

-- create some test data
declare @states table (statecode varchar(2), sortseq int)
insert into @states values ('AL',0)
insert into @states values ('AK',0)
insert into @states values ('AZ',0)
insert into @states values ('AR',0)
insert into @states values ('CA',0)

declare @customer table (custid int, statecode varchar(2), createddate smalldatetime) -- statecode is FK to @states
insert into @customer values (1, 'AK', '1/1/2009')
insert into @customer values (2, 'AK', '2/2/2009') -- AK most popular (2 customers)
insert into @customer values (3, 'AR', '3/3/2009') -- AR most recent createddate

declare @hold table (statecode varchar(2), sortseq int)


-- Start by sorting all statecodes alphabetically
update
	s
set
	sortseq = a.sortseq
from
	@states s
join
	(
	select
		statecode,
		rank() over (order by statecode) as sortseq
	from
		@states
	) as a on s.statecode = a.statecode



-- set top 2 most recently used first using createddate from foreign key table
if @SortMethod = 'MostRecentlyUsed'
begin
	-- get top two most recently used statecodes from foreign key table
	insert into
		@hold
	select top 2
		statecode,
		sortseq
	from
		(
		select distinct
			statecode,
			-rank() over (order by createddate) as sortseq
		from 
			-- get max createddate per statecode
			(
			select 
				statecode, 
				(select max(c2.createddate) from @customer c2 where c.statecode=c2.statecode) as createddate 
			from
				@customer c
			group by
				statecode
			) as mru
		) as p
	order by 
		sortseq
end



-- set top 2 most popular first using counts from foreign key table
if @SortMethod = 'MostCommonlyUsed'
begin
	-- get top two used statecodes
	insert into
		@hold
	select top 2
		statecode,
		sortseq
	from
		-- get usage count of each statecode from foreign key table
		(
		select distinct
			statecode,
			-rank() over (order by count(*)) as sortseq
		from 
			@customer
		group by 
			statecode
		) as p
	order by 
		sortseq
end


-- save the new ordering nightly or monthly
update
	s
set
	sortseq = h.sortseq
from
	@states s
join
	@hold h on s.statecode = h.statecode


-- show the results
select * from @states order by sortseq

Rate

5 (1)

You rated this post out of 5. Change rating

Share

Share

Rate

5 (1)

You rated this post out of 5. Change rating