2013-04-18 134 views
1

我想在多年後回到sql。我也是Sybase新手。你能否建議一個可能的查詢以解決以下問題?可能的sybase sql查詢

有一張叫蔬菜的桌子如下。

| product | price | date  | 
| beans | 1.78 | 20040903 | 
| beans | 1.79 | 20040902 | 
| potato | 1.78 | 20040902 | 

我需要得到每種蔬菜的最新可用價格。預期的數據庫是sybase。非常感謝。

回答

3

您可以使用子查詢來獲得max(date)每個product然後再加入回你的表:

select v1.product, 
    v1.price, 
    v1.date 
from vegetables v1 
inner join 
(
    select product, max(date) MaxDate 
    from vegetables 
    group by product 
) v2 
    on v1.product = v2.product 
    and v1.date = v2.maxdate; 

SQL Fiddle with Demo(Demo是SQL Server,但語法應該是有效的)。

如果Sybase的版本支持窗口的功能,那麼你可以使用以下命令:

select product, price, date 
from 
(
    select product, price, date, 
    row_number() over(partition by product order by date desc) rn 
    from vegetables 
) v 
where rn = 1; 

SQL Fiddle with Demo

+0

**'選擇產品,最大的蔬菜(日期)MAXDATE 通過product' 組** - 爲什麼我們不能用這個查詢? ** [SQL小提琴](http://sqlfiddle.com/#!3/41951/4)** – Luv

+2

因爲他們希望與最高日期相關的價格,如果你添加,你將不得不由它分組以及價值觀是不同的。 – Taryn

+0

@bluefeet優秀的答案。並用sql小提琴很好的提示(不知道那一個)。我在概念上想着做這樣的操作,但對語法不確定。現在我看到它是有道理的。 '分區的行號'語法對我來說是新的。將不得不看這個。非常感謝。 – junkie

0

從我的理解,標準的SQL查詢應該工作,在大多數情況下,基於Sybase數據庫。我不是DB管理,但sometihng像這可能工作:

SELECT * FROM 
    vegetables v 
INNER JOIN 
    (SELECT 
     iv.id, 
     MAX(iv.date) AS date 
    FROM 
     vegetables iv 
    GROUP BY 
     iv.id 
) maxv ON maxv.date = v.date