I have a table with data and dates like so:
DECLARE @p TABLE (P_key int, P_Data char(1), P_ValidUntil datetime)
INSERT @p VALUES (20, 'T', '2003-02-28')
INSERT @p VALUES (21, 'U', '2005-05-31')
INSERT @p VALUES (30, 'V', '2006-09-30')
INSERT @p VALUES (30, 'W', '2008-04-30')
INSERT @p VALUES (31, 'X', '2007-06-30')
INSERT @p VALUES (32, 'Y', '2005-01-31')
INSERT @p VALUES (32, 'Z', '2007-06-30')
INSERT @p VALUES (33, 'A', '2005-06-30')
Given: qKey (only multiples of 10), qDate
Find: All entries that match qKey in the first digit and have a date larger then qDate. Return only one result per P_key (the one with the next higher P_ValidUntil to qDate).
The current solution is:
DECLARE @qKey AS int;
DECLARE @qDate AS datetime;
SET @qKey=30;
SET @qDate='2006-01-01';
SELECT * FROM @p WHERE
@qKey = (P_Key/10)*10
AND @qDate <= P_ValidUntil
which returns:
30 V 2006-09-30 00:00:00.000
30 W 2008-04-30 00:00:00.000
31 X 2007-06-30 00:00:00.000
32 Z 2007-06-30 00:00:00.000
This is basically correct, except that there are two entries for 30 (both are bigger than @qDate). I only want the smallest date of these multiple hits in the result:
30 V 2006-09-30 00:00:00.000
31 X 2007-06-30 00:00:00.000
32 Z 2007-06-30 00:00:00.000
Thanks in advance!