久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

根據(jù)前一行內(nèi)的計(jì)算值創(chuàng)建計(jì)算值

Create calculated value based on calculated value inside previous row(根據(jù)前一行內(nèi)的計(jì)算值創(chuàng)建計(jì)算值)
本文介紹了根據(jù)前一行內(nèi)的計(jì)算值創(chuàng)建計(jì)算值的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

我正在嘗試找到一種方法,將每月百分比變化應(yīng)用于預(yù)測(cè)定價(jià).我在 excel 中設(shè)置了我的問題,使其更清楚一些.我使用的是 SQL Server 2017.

I'm trying to find a way to apply monthly percentage changes to forecast pricing. I set my problem up in excel to make it a bit more clear. I'm using SQL Server 2017.

我們會(huì)說 18 年 9 月 1 日之前的所有月份都是歷史月份,而 2018 年 9 月 1 日及以后的月份都是預(yù)測(cè)月份.我需要使用...計(jì)算預(yù)測(cè)價(jià)格(樣本數(shù)據(jù)上的黃色陰影)

We'll say all months before 9/1/18 are historical and 9/1/18 and beyond are forecasts. I need to calculate the forecast price (shaded in yellow on the sample data) using...

Forecast Price = (Previous Row Forecast Price * Pct Change) + Previous Row Forecast Price

需要說明的是,我的數(shù)據(jù)中尚不存在黃色陰影價(jià)格.這就是我試圖讓我的查詢計(jì)算.由于這是每月百分比變化,每一行都依賴于前一行并且超出了單個(gè) ROW_NUMBER/PARTITION 解決方案,因?yàn)槲覀儽仨毷褂弥坝?jì)算出的價(jià)格.顯然,excel 中的簡單順序計(jì)算在這里有點(diǎn)困難.知道如何在 SQL 中創(chuàng)建預(yù)測(cè)價(jià)格列嗎?

Just to be clear, the yellow shaded prices do not exist in my data yet. That is what I am trying to have my query calculate. Since this is monthly percentage change, each row depends on the row before and goes beyond a single ROW_NUMBER/PARTITION solution because we have to use the previous calculated price. Clearly what is an easy sequential calculation in excel is a bit more difficult here. Any idea how to create forecasted price column in SQL?

推薦答案

您需要使用遞歸 CTE.這是查看前一行計(jì)算值的一種更簡單的方法:

You need to use a recursive CTE. That is one of the easier ways to look at the value of a calculated value from previous row:

DECLARE @t TABLE(Date DATE, ID VARCHAR(10), Price DECIMAL(10, 2), PctChange DECIMAL(10, 2));
INSERT INTO @t VALUES
('2018-01-01', 'ABC', 100,    NULL),
('2018-01-02', 'ABC', 150,   50.00),
('2018-01-03', 'ABC', 130,  -13.33),
('2018-01-04', 'ABC', 120,  -07.69),
('2018-01-05', 'ABC', 110,  -08.33),
('2018-01-06', 'ABC', 120,    9.09),
('2018-01-07', 'ABC', 120,    0.00),
('2018-01-08', 'ABC', 100,  -16.67),
('2018-01-09', 'ABC', NULL, -07.21),
('2018-01-10', 'ABC', NULL,   1.31),
('2018-01-11', 'ABC', NULL,   6.38),
('2018-01-12', 'ABC', NULL, -30.00),
('2019-01-01', 'ABC', NULL,  14.29),
('2019-01-02', 'ABC', NULL,   5.27);

WITH ncte AS (
    -- number the rows sequentially without gaps
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date) AS rn
    FROM @t
), rcte AS (
    -- find first row in each group
    SELECT *, Price AS ForecastedPrice
    FROM ncte AS base
    WHERE rn = 1
    UNION ALL
    -- find next row for each group from prev rows
    SELECT curr.*, CAST(prev.ForecastedPrice * (1 + curr.PctChange / 100) AS DECIMAL(10, 2))
    FROM ncte AS curr
    INNER JOIN rcte AS prev ON curr.ID = prev.ID AND curr.rn = prev.rn + 1
)
SELECT *
FROM rcte
ORDER BY ID, rn

結(jié)果:

| Date       | ID  |  Price | PctChange | rn | ForecastedPrice |
|------------|-----|--------|-----------|----|-----------------|
| 2018-01-01 | ABC | 100.00 |      NULL |  1 |          100.00 |
| 2018-01-02 | ABC | 150.00 |     50.00 |  2 |          150.00 |
| 2018-01-03 | ABC | 130.00 |    -13.33 |  3 |          130.01 |
| 2018-01-04 | ABC | 120.00 |     -7.69 |  4 |          120.01 |
| 2018-01-05 | ABC | 110.00 |     -8.33 |  5 |          110.01 |
| 2018-01-06 | ABC | 120.00 |      9.09 |  6 |          120.01 |
| 2018-01-07 | ABC | 120.00 |      0.00 |  7 |          120.01 |
| 2018-01-08 | ABC | 100.00 |    -16.67 |  8 |          100.00 |
| 2018-01-09 | ABC |   NULL |     -7.21 |  9 |           92.79 |
| 2018-01-10 | ABC |   NULL |      1.31 | 10 |           94.01 |
| 2018-01-11 | ABC |   NULL |      6.38 | 11 |          100.01 |
| 2018-01-12 | ABC |   NULL |    -30.00 | 12 |           70.01 |
| 2019-01-01 | ABC |   NULL |     14.29 | 13 |           80.01 |
| 2019-01-02 | ABC |   NULL |      5.27 | 14 |           84.23 |

DB Fiddle 演示

這篇關(guān)于根據(jù)前一行內(nèi)的計(jì)算值創(chuàng)建計(jì)算值的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(將每個(gè)子標(biāo)記轉(zhuǎn)換為具有多個(gè)分隔符的單列-SQL Server (3))
How can I create a view from more than one table?(如何從多個(gè)表創(chuàng)建視圖?)
How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何將表格的前兩列堆疊成一列,但也僅將第三列與第一列配對(duì)?) - IT屋-程序員軟件開發(fā)技
Recursive t-sql query(遞歸 t-sql 查詢)
Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(將月份名稱轉(zhuǎn)換為日期/月份編號(hào)(問題和答案的組合))
Join instead of correlated subquery(加入而不是相關(guān)子查詢)
主站蜘蛛池模板: 亚洲高清三级 | 免费激情网站 | 国产精品99一区二区 | 欧美 日韩 亚洲91麻豆精品 | 九九九视频在线观看 | 亚洲免费在线观看 | 一级毛片视频在线 | 国产91一区 | 青草久久免费视频 | 亚洲最大福利网 | 免费久久99精品国产婷婷六月 | 久久久久久国产精品 | 日本三级播放 | 精品福利一区二区三区 | 免费天天干 | 国产精品久久久免费 | 99热在这里只有精品 | 成人午夜在线观看 | 中文字幕日韩专区 | 日本在线免费 | 久久精品中文字幕 | 国产在线拍偷自揄拍视频 | 国产一区二区三区四区区 | a级在线观看 | 国产一区二区 | 热久久999| 免费不卡一区 | 国产在线观 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 亚洲天堂中文字幕 | 亚洲日日操 | av网站免费观看 | 欧美视频偷拍 | 日本成人片在线观看 | 国产精品免费一区二区三区四区 | 精品欧美一区二区三区久久久 | 黄色网址av | 91资源在线观看 | 一级黄大片 | 午夜影院网站 | 三级黄色片在线观看 |