2015-12-21 126 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