2013-03-27 75 views
0

我有一個簡單的表:獲取價格在每週末

prices(fromwhichweek(int),newprice(int)) 
data example: 
1,20 
3,21 
10,30 

所以即時尋找一個SQL語句(S)返回在每個週末是什麼價格?
喜歡的東西(根據上述3行):

1,20 
2,20 
3,21 
4,21 
5,21 
6,21 
7,21 
8,21 
9,21 
10,30 
... 
+0

是根據您的示例輸入您的預期結果?如果是這樣,你還有更多解釋要做 – 2013-03-27 00:30:56

+0

看起來這裏的目標是用前一週的價格填補缺失的周。但是,我們怎麼知道要求的週數範圍? – WarrenT 2013-03-27 00:36:27

回答

-2

您可以創建填充了52周的表。

create table weeks (week int); 
insert into weeks values (1), (2), ....(52); 

然後您可以執行以下查詢來獲得結果。這是一個本地MYSQL查詢。如果您使用的是不同的SQL供應商,則可能需要稍微更改它。

select A.week, B.price from weeks as A, prices as B where 
    B.fromwhichweek = (select C.fromwhichweek from prices as C where 
         C.fromwhichweek <= A.week order by C.fromwhichweek desc limit 1); 
-1

這會給你你說你想要的輸出。如果你想要的東西不同,修改你的問題:)

SELECT 
    fromwhichweek, price 
FROM 
    prices 
ORDER BY 
    fromwhichweek ASC 
+0

它不會給我每個星期... – Palpatine 2013-03-27 00:29:43

+0

您的示例數據顯示只有一個'fromwhichweek'發生。是否有多個'從不同的'價格是誰?如果您想要更可行的答案,請發佈更多樣本數據。 – rbedger 2013-03-27 00:31:49

+0

示例已編輯。 「從whwhweek」只有一次發生。主要目標是得到一週價格是多少,因爲有另一個有訂單的表,並且有哪個星期,哪個人訂購的是這樣的: person1,1(week),1(day),whatordered; person1,1(week),2(day),whatordered; person1,1(week),3(day),whatordered; person1,2(week),1(day),whatordered; person1,2(week),2(day),whatordered; 我想知道一個人每天必須付多少錢(存儲在prices.newprice)我希望我澄清問題 – Palpatine 2013-03-27 00:52:38

0

您需要生成一個星期序列。以下版本由select語句中使用相關子查詢得到的價格:

select w.week, 
     (select top 1 newprice from prices p where w.week >= p.fromwhichweek 
     order by fromwhichweek desc 
     ) theprice 
from (select 1 as week union all select 2 union all select 3 union all select 4 union all 
     select 5 union all select 6 union all select 7 union all select 8 union all 
     select 9 union all select 10 
    ) w 

一些評論。這取決於有一個星期的清單。這是用一個明確的子查詢完成的。取決於數據庫,還有其他方法。

+0

@AaronBertrand。 。 。我想我可能會失明。這個標籤重複了三次,我設法錯過了它。 – 2013-03-27 01:15:19

0

以下是根據表中最高的fromwhichweek值確定動態需要的週數的方法。您可以通過明確地指定@end(例如,嘗試22或25)而不是使用MAX來擴展該值。這應該用52周的時間來衡量,假定你的價格表真的很簡單。

DECLARE @prices TABLE(fromwhichweek INT, newprice INT); 

INSERT @prices VALUES 
(1, 20), 
(3, 21), 
(10,30); 

DECLARE @start INT, @end INT; 

SELECT @start = MIN(fromwhichweek), 
     @end = MAX(fromwhichweek) 
FROM @prices; 

;WITH x AS 
(
    SELECT TOP (@[email protected]+1) 
    n = @start-1+ROW_NUMBER() OVER (ORDER BY [object_id]) 
    FROM sys.all_objects ORDER BY [object_id] 
) 
SELECT fromwhichweek = x.n, 
    newprice = COALESCE(p.newprice, (
    SELECT TOP (1) newprice FROM @prices 
    WHERE fromwhichweek <= x.n 
    AND newprice IS NOT NULL 
    ORDER BY fromwhichweek DESC)) 
FROM x 
    LEFT OUTER JOIN @prices AS p 
    ON x.n = p.fromwhichweek 
ORDER BY x.n;