【问题标题】:How can I pull previous month data如何提取上个月的数据
【发布时间】:2022-01-15 11:55:08
【问题描述】:

我们有一个数据仓库,过去 14 年来我们一直在其中存储数据。 我正在使用 SQL Server 2016 版本。 它是个人信息数据。这基本上是有关存款的数据,其中将包含以下列,例如: MemberID、membershipDate、MonthlyDepositdate、DepositAmount。

直到 5 年前,会员信息每年都会更新到 DW,但从过去 5 年开始,每月都会提取数据并定期附加到 dw。

现在,我的问题是一些在过去 5 年前加入的会员有每月存款日期和每年更新日期,例如:2011-01-01; 2012-12-31, 2013-12-31 等...但从过去 5 年开始,我们每个月都存储数据,因此每月存款日期如下所示: 2017-01-31; 2017-02-28; 2017-03-31等...以及相应的存款金额。

所以现在我需要提取上个月存款金额的数据以及当前月份的存款金额。对于这个要求,我可以简单地使用 EOMONTH(DATEADD,-1, Monthly Deposit Date) 来做到这一点,但正如我所说,直到过去 5 年,我们存储的数据都是基于年度的。请如何实现这种情况,非常感谢您的帮助。 请注意:-您可能已经观察到,直到 2016 年的数据每年都会追加,而从 2017 年开始,数据会按月保存。

我原来的dw表:

MemberID, membershipDate, MonthlyDepositdate, DepositAmount. 
111       2003-02-15      2003-12-31          53.00
111       2003-02-15      2004-12-31          101.00
111       2003-02-15      2005-12-31          162.00
...        ....             ...                ...
111       2003-02-15      2017-01-31          1650.00
111       2003-02-15      2017-02-28          1660.00
111       2003-02-15      2017-03-31          1672.00
222       2014-05-19      2014-12-31          30.00
222       2014-05-19      2015-12-31          72.00
222       2014-05-19      2016-12-31          113.00
222       2014-05-19      2017-01-31          115.00
222       2014-05-19      2017-02-28          120.00
222       2014-05-19      2017-03-31          123.00

我需要产生如下结果:

MemberID, membershipDate, MonthlyDepositdate, DepositAmount, PreviousMonthDepositDate, PreviousmonthDepositAmt
111       2003-02-15      2003-12-31          53.00           ___                       0.0
111       2003-02-15      2004-12-31          101.00          2003-12-31                53.00
111       2003-02-15      2005-12-31          162.00          2004-12-31                101.00
...        ....             ...                ...             ....                      ...
111       2003-02-15      2017-01-31          1650.00         2016-12-31                1600.00
111       2003-02-15      2017-02-28          1660.00         2017-01-31                1650.00
111       2003-02-15      2017-03-31          1672.00         2017-02-28                1660.00
222       2014-05-19      2014-12-31          30.00           ___                       0.0
222       2014-05-19      2015-12-31          72.00           2014-12-31                30.00
222       2014-05-19      2016-12-31          113.00          2015-12-31                72.00
222       2014-05-19      2017-01-31          115.00          2016-12-31                113.00
222       2014-05-19      2017-02-28          120.00          2017-01-31                115.00
222       2014-05-19      2017-03-31          123.00          2017-02-28                120.00

【问题讨论】:

  • 似乎您总是想要“以前的”,无论是按年还是按月。您应该查看 LAG。
  • 你是绝对正确的。无论年月日,我只需要前一个日期。 LAG 功能真的很棒。非常感谢!

标签: sql sql-server tsql


【解决方案1】:

像这样关闭您的示例数据应该可以。

declare @Something table
(
    MemberID int
    , membershipDate date
    , MonthlyDepositdate date
    , DepositAmount decimal(7,2)
)

insert @Something
select 111, '2003-02-15', '2003-12-31', 53.00 union all
select 111, '2003-02-15', '2004-12-31', 101.00 union all
select 111, '2003-02-15', '2005-12-31', 162.00 union all
select 111, '2003-02-15', '2017-01-31', 1650.00 union all
select 111, '2003-02-15', '2017-02-28', 1660.00 union all
select 111, '2003-02-15', '2017-03-31', 1672.00 union all
select 222, '2014-05-19', '2014-12-31', 30.00 union all
select 222, '2014-05-19', '2015-12-31', 72.00 union all
select 222, '2014-05-19', '2016-12-31', 113.00 union all
select 222, '2014-05-19', '2017-01-31', 115.00 union all
select 222, '2014-05-19', '2017-02-28', 120.00 union all
select 222, '2014-05-19', '2017-03-31', 123.00

select MemberID
    , membershipDate
    , MonthlyDepositdate
    , DepositAmount
    , PreviousMonthDepositDate = lag(MonthlyDepositDate, 1) over(partition by MemberID order by MonthlyDepositDate)
    , PreviousmonthDepositAmt = lag(DepositAmount, 1) over(partition by MemberID order by MonthlyDepositDate)
from @Something

【讨论】:

  • 感谢@Sean Lange,通过使用滞后窗口功能,逻辑确实运作良好。非常感谢您的快速回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多