我有一个包含数据和日期的表格,如下所示:
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')
给定:qKey(只能是 10 的倍数),qDate
查找:在第一个数字中匹配 qKey 且日期大于 qDate 的所有条目。每个 P_key 仅返回一个结果(具有下一个更高 P_ValidUntil 到 qDate 的结果)。
目前的解决方案是:
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
返回:
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
这基本上是正确的,除了 30 有两个条目(都大于@qDate)。我只想要结果中这些多次匹配的最小日期:
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
提前致谢!
第一个修复是:
谢谢。
使用窗口函数
仅供参考:2 个答案中使用的两种技术都很常见,因为这是一个常见问题。此 DBA-SE 问题中的示例:How to get the MAX row