2015-12-21 123 views
3

我們有一個表,按日期舉行的累積量的值,例如:累計金額按日期

|  date.  |   | 

| 2015-03-01 | 1.23 | 

| 2015-03-04 | 1.98 | 

| 2015-03-06 | 2.23 | 

And we have a table with all dates we need, for instance: 

|  date.  | 

| 2015-03-01 | 

| 2015-03-02 | 

| 2015-03-03 | 

| 2015-03-04 | 

| 2015-03-05 | 

| 2015-03-06 | 

We would like to get: 

|  date.  |   | 

| 2015-03-01 | 1.23 | 

| 2015-03-02 | 1.23 | 

| 2015-03-03 | 1.23 | 

| 2015-03-04 | 1.98 | 

| 2015-03-05 | 1.98 | 

| 2015-03-06 | 2.23 | 

這有可能只是用SQL本身?

我正在努力想弄清楚如何做到這一點。

我嘗試了一些交叉連接操作,但沒有成功。

感謝

回答

2

我意識到 - 它應該是在這種特殊情況下甚至simplier(多simplier)。
嘗試下面

SELECT 
    dates_table.date, 
    MAX(amounts.amount) OVER(ORDER BY dates_table.date) AS amount 
FROM dates_table LEFT JOIN amounts_table 
ON dates_table.date = amounts_table.date 

你們有些人有采用這個答案,並認爲它 不工作的問題 - 我只是添加下面的例子來「證明」上述工作 :O)

SELECT  
    dates.date, 
    MAX(amounts.amount) OVER(ORDER BY dates.date) AS amount 
FROM ( 
    SELECT * FROM  
    (SELECT '2015-03-01' AS [date]),  
    (SELECT '2015-03-02' AS [date]),  
    (SELECT '2015-03-03' AS [date]),  
    (SELECT '2015-03-04' AS [date]),  
    (SELECT '2015-03-05' AS [date]),  
    (SELECT '2015-03-06' AS [date]) 
) AS dates 
LEFT JOIN ( 
    SELECT * FROM  
    (SELECT '2015-03-01' AS [date], 1.23 AS amount),  
    (SELECT '2015-03-04' AS [date], 1.98 AS amount),  
    (SELECT '2015-03-06' AS [date], 2.23 AS amount) 
) AS amounts 
ON dates.date = amounts.date 

結果是:

Row dates_date amount 
1 2015-03-01 1.23  
2 2015-03-02 1.23  
3 2015-03-03 1.23  
4 2015-03-04 1.98  
5 2015-03-05 1.98  
6 2015-03-06 2.23 
+0

對不起,我無法重現這一個,它在第二次更改金額後沒有正確得到值,第一個令人驚訝地工作,非常感謝您 –

+0

當然,沒問題 - 它在我的快速測試 - 所以我想分享它。我相信 - 它仍然應該工作 - 但你需要小心字段命名 - 如果你有機會嘗試使它的工作:o) –

+0

添加例子到答案 –

4
SELECT 
    [date], 
    amount 
FROM (
    SELECT 
    [date], 
    amount, 
    ROW_NUMBER() OVER(PARTITION BY [date] ORDER BY delta) AS win 
    FROM ( 
    SELECT 
     dates_table.date AS [date], 
     DATEDIFF(TIMESTAMP(dates_table.date), TIMESTAMP(amounts_table.date)) AS delta, 
     amount 
    FROM amounts_table CROSS JOIN dates_table 
    WHERE DATEDIFF(TIMESTAMP(dates_table.date), TIMESTAMP(amounts_table.date)) >= 0 
) 
) 
WHERE win = 1 
ORDER BY 1