2013-08-29 186 views
3

我想要做的是從表中選擇價格從表中開始和結束日期之間給定的日期。查詢返回日期範圍內的行,但僅返回列的最大值

SELECT price 
FROM table 
WHERE 'dategiven' BETWEEN startdate AND enddate 

這是很容易與日期時間過濾器。問題是我在提供的時間窗口中有多條記錄,我也有一個版本列。

下面我有我的表的例子:

enter image description here

我想我的查詢輸出是如下在我的dategiven2013-08-25 enter image description here

牛奶有3條記錄,其中有2適用於dategiven(2013-08-25)。然後我想要返回最高版本的結果?

類似:

SELECT 
    price 
FROM table 
WHERE 'dategiven' BETWEEN startdate AND enddate AND max(version) 

回答

1

使用row_number()功能進行排名的行

select product, price, version 
from 
( 
    select 
     *, 
     row_number() over (partition by product order by version desc) rn 
    from yourtable 
    where @dategiven between startdate and enddate 
) v 
where rn = 1 
1

未必是最有效的方法,但是:

select price 
from table 
where 
    'dategiven' between startdate and enddate 
    and version = 
    (
     select max(version) from table t2 where t2.product = table.product 
     and 'dategiven' between startdate and enddate 
    ) 
+0

日期過濾器應位於子查詢中。 – podiluska

+0

對不起,我已更新。 – beiller

+0

如果每個產品的版本號是唯一的,您不需要在主查詢上的startdate和enddate之間具有'dategiven',只需將其放在子查詢中就足夠了 –

1

你也可以試試這個

select t.product, t.price, version 
from table t 
inner join 
(select product, max(version) maxVerion from table where 
'dategiven' between startdate and enddate group by product) temp 
on temp.product = t.product and t.version = temp.maxVerion 

希望它有幫助。

0

我的電腦安裝的不是sqlservert而是mysql。我不知道這很複雜。

select t.product, t.price, v.version 
    (
    select temp.product, max(temp.version) as version 
    from 
    (
     select product, price, startDate, endDate, version 
     from Table 
     where 'dategiven' between startDate and endDate 
    ) as temp 
    group by temp.product 
) as v 
    inner join Table as t 
    on v.version = t.version 
相關問題