2014-09-01 123 views
1

我有下表,其中有几个关键字段。最重要的是版本和日期。 enter image description here 我需要一个查询,它允许我显示系统中每个公司和产品的活动价格。sql,仅返回表中记录的最大版本

因此显示开始和结束之间的所有日期,很容易 只显示带有这些结果的最大版本 - 这是我卡住的地方。

我创建了一个小提琴显示我的例子 http://sqlfiddle.com/#!6/e0d4f/3

我怎么能只返回记录具有日期范围内的最高版本,每家公司的产品?

这是我迄今为止,但不完全:

select * from 
prices 
where getdate() between [start] and [end] 
--and max(version) 
+0

您的桌子没有主键? – 2014-09-01 08:47:25

+0

只是一个例子谢谢,肯定有一个主键 – Smudger 2014-09-01 08:55:32

+0

@JoëlSalamin:主键很可能是公司+产品+版本。你如何得到没有的想法?它给出的问题有什么不同? – 2014-09-01 09:08:46

回答

3
;WITH PricesCTE AS 
(
    SELECT *, 
     ROW_NUMBER()OVER(PARTITION BY companyid,product ORDER BY version DESC) AS rn 
    FROM prices 
    WHERE GETDATE() BETWEEN [start] AND [end] 
) 
SELECT * 
FROM PricesCTE 
WHERE rn = 1 

SQLFiddle Demo

+0

这是一个很好的方法。但是,您忘记了添加WHERE子句以仅显示当前价格。 – 2014-09-01 08:59:48

+0

@ThorstenKettner这是我阅读你的答案后看到的。我得到了充实,因为如果你在正确的屏幕截图中看到预期的结果,他们就会与我的相匹配。我正在更新我的答案。 – 2014-09-01 09:02:05

1

首先找到每个产品的最高版本为所需的日期。然后加入您的表格以获取该记录。

select * 
from 
(
    select companyid, product, max(version) as max_version 
    from prices 
    where getdate() between [start] and [end] 
    group by companyid, product 
) this_date 
inner join prices 
    on prices.companyid = this_date.companyid 
    and prices.product = this_date.product 
    and prices.version = this_date.max_version; 

这里是SQL小提琴:http://sqlfiddle.com/#!6/e0d4f/32