R语言 使用条件复制像元值

0sgqnhkj  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(85)

我正在使用SQL中的一个数据库,并有一个如下形式的表:

key  total  pmt    month
   ----  ------ -----  -------
    abc1  100    1       10
    ae10  1000   100      7
    etc.
---------------------------

我想为每个键复制pmt值,从给定月份开始,直到月份180,如果sum(pmt) = total,则更少。
你知道如何在SQL中编写代码吗?(R也可以)。
谢谢

gupuwyp2

gupuwyp21#

我有SQL Server,而不是Azure,但我认为这会起作用。
样本数据:

library(DBI)
quux <- structure(list(key = c("abc1", "ae10"), total = c(100L, 1000L), pmt = c(1L, 100L), month = c(10L, 7L)), class = "data.frame", row.names = c(NA, -2L))
# ss <- DBI::dbConnect(...)
dbWriteTable(ss, "mytable", quux)

为了演示generate_series的基本功能,我将从month扩展到12。请注意totalpmtmonth是如何填充的,intvalue(来自generate_series的值)是如何递增的:

dbGetQuery(ss, "
with cte_g as (
  select intvalue from generate_series(1, 12, 1)
)
select *
from cte_g join mytable t on cte_g.intvalue >= t.month")
#   intvalue  key total pmt month
# 1       10 abc1   100   1    10
# 2       11 abc1   100   1    10
# 3       12 abc1   100   1    10
# 4        7 ae10  1000 100     7
# 5        8 ae10  1000 100     7
# 6        9 ae10  1000 100     7
# 7       10 ae10  1000 100     7
# 8       11 ae10  1000 100     7
# 9       12 ae10  1000 100     7

我们将只使用month开始这个系列,然后在查询的其余部分使用intvalue作为month
为了不填写这个屏幕,我将扩展到20。这演示了当pmt2(累积)达到/超过total时,ae10如何停止,而abc1将持续到第20个月(我在这里人为地停止了它):

DBI::dbGetQuery(ss, "
with cte_g as (
  select intvalue from generate_series(1, 180, 1)
),
cte_main as (
  select t.[key], t.total, t.pmt, cte_g.intvalue as month,
    sum(t.pmt) OVER (PARTITION BY t.[key] ORDER BY cte_g.intvalue ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS pmt2
  from cte_g join mytable t on cte_g.intvalue >= t.month
)
select * from cte_main
where pmt2 <= total")
#     key total pmt month pmt2
# 1  abc1   100   1    10    1
# 2  abc1   100   1    11    2
# 3  abc1   100   1    12    3
# 4  abc1   100   1    13    4
# 5  abc1   100   1    14    5
# 6  abc1   100   1    15    6
# 7  abc1   100   1    16    7
# 8  abc1   100   1    17    8
# 9  abc1   100   1    18    9
# 10 abc1   100   1    19   10
# 11 abc1   100   1    20   11
# 12 ae10  1000 100     7  100
# 13 ae10  1000 100     8  200
# 14 ae10  1000 100     9  300
# 15 ae10  1000 100    10  400
# 16 ae10  1000 100    11  500
# 17 ae10  1000 100    12  600
# 18 ae10  1000 100    13  700
# 19 ae10  1000 100    14  800
# 20 ae10  1000 100    15  900
# 21 ae10  1000 100    16 1000

20更改为180,您将填写到第109个月,此时pmt2为100(与total相同)。
因为key是一个保留字,所以我用方括号将其括起来,标记为带引号的标识符(也可以使用双引号)。

相关问题