用变量按行排序
over order by rows with variable
有没有办法在下面的公式中使用变量作为动态数字,这样当对手在 id 列中发生变化时,我可以将 4game_so_ct 数字重置为零。我也尝试过按 id 排序,这显然只是按 id 排序,并没有重置数字。列 4game 是要查看的前行数,以获取 id 相同的前行数。
sum(strikeouts) over (order by game_dt rows between 3 preceding and current row) as 4game_so_ct
我试过的
sum(strikeouts) over (order by game_dt rows between 4game preceding and current row) as 4game_so_ct
但是很明显出错了
我有一个 table 如下所示
GAME_ID GAME_DT HOME_TEAM_ID AWAY_TEAM_ID id strikeouts 4game test 4game_so_ct
WS1192204120 19220412 WS1 NYA NYAWS1 4 0 0 4
BOS192204180 19220418 BOS NYA NYABOS 2 0 NYAWS1 2
NYA192204210 19220421 NYA WS1 WS1NYA 1 0 NYABOS 1
NYA192204220 19220422 NYA WS1 WS1NYA 2 1 WS1NYA 2
NYA192204230 19220423 NYA WS1 WS1NYA 0 2 WS1NYA 0
NYA192204250 19220425 NYA PHA PHANYA 1 0 WS1NYA 1
NYA192204260 19220426 NYA PHA PHANYA 4 1 PHANYA 4
NYA192204280 19220428 NYA BOS BOSNYA 0 0 PHANYA 0
NYA192204290 19220429 NYA BOS BOSNYA 6 1 BOSNYA 6
NYA192204300 19220430 NYA BOS BOSNYA 4 2 BOSNYA 4
NYA192205010 19220501 NYA BOS BOSNYA 2 3 BOSNYA 2
NYA192205020 19220502 NYA BOS BOSNYA 1 4 BOSNYA 1
我希望在 4game_so_ct 列中看到的内容
GAME_ID GAME_DT HOME_TEAM_ID AWAY_TEAM_ID id strikeouts 4game test 4game_so_ct
WS1192204120 19220412 WS1 NYA NYAWS1 4 0 0 4
BOS192204180 19220418 BOS NYA NYABOS 2 0 NYAWS1 2
NYA192204210 19220421 NYA WS1 WS1NYA 1 0 NYABOS 1
NYA192204220 19220422 NYA WS1 WS1NYA 2 1 WS1NYA 3
NYA192204230 19220423 NYA WS1 WS1NYA 0 2 WS1NYA 3
NYA192204250 19220425 NYA PHA PHANYA 1 0 WS1NYA 1
NYA192204260 19220426 NYA PHA PHANYA 4 1 PHANYA 5
NYA192204280 19220428 NYA BOS BOSNYA 0 0 PHANYA 0
NYA192204290 19220429 NYA BOS BOSNYA 6 1 BOSNYA 6
NYA192204300 19220430 NYA BOS BOSNYA 4 2 BOSNYA 10
NYA192205010 19220501 NYA BOS BOSNYA 2 3 BOSNYA 12
NYA192205020 19220502 NYA BOS BOSNYA 1 4 BOSNYA 13
语法图可能有点难以理解。但是documentation明确了window帧规范需要是常量:
<window frame preceding> ::=
{
UNBOUNDED PRECEDING
| <unsigned_value_specification> PRECEDING
| CURRENT ROW
}
. . .
<unsigned value specification> ::=
{ <unsigned integer literal> }
因此,您无法使用 windows 框架规范来做您想做的事情。
你把它复杂化了。在 SUM
中使用 partition by
,这是预期的结果。
sum(strikeouts) over (partition by id order by game_dt)
有没有办法在下面的公式中使用变量作为动态数字,这样当对手在 id 列中发生变化时,我可以将 4game_so_ct 数字重置为零。我也尝试过按 id 排序,这显然只是按 id 排序,并没有重置数字。列 4game 是要查看的前行数,以获取 id 相同的前行数。
sum(strikeouts) over (order by game_dt rows between 3 preceding and current row) as 4game_so_ct
我试过的
sum(strikeouts) over (order by game_dt rows between 4game preceding and current row) as 4game_so_ct
但是很明显出错了
我有一个 table 如下所示
GAME_ID GAME_DT HOME_TEAM_ID AWAY_TEAM_ID id strikeouts 4game test 4game_so_ct
WS1192204120 19220412 WS1 NYA NYAWS1 4 0 0 4
BOS192204180 19220418 BOS NYA NYABOS 2 0 NYAWS1 2
NYA192204210 19220421 NYA WS1 WS1NYA 1 0 NYABOS 1
NYA192204220 19220422 NYA WS1 WS1NYA 2 1 WS1NYA 2
NYA192204230 19220423 NYA WS1 WS1NYA 0 2 WS1NYA 0
NYA192204250 19220425 NYA PHA PHANYA 1 0 WS1NYA 1
NYA192204260 19220426 NYA PHA PHANYA 4 1 PHANYA 4
NYA192204280 19220428 NYA BOS BOSNYA 0 0 PHANYA 0
NYA192204290 19220429 NYA BOS BOSNYA 6 1 BOSNYA 6
NYA192204300 19220430 NYA BOS BOSNYA 4 2 BOSNYA 4
NYA192205010 19220501 NYA BOS BOSNYA 2 3 BOSNYA 2
NYA192205020 19220502 NYA BOS BOSNYA 1 4 BOSNYA 1
我希望在 4game_so_ct 列中看到的内容
GAME_ID GAME_DT HOME_TEAM_ID AWAY_TEAM_ID id strikeouts 4game test 4game_so_ct
WS1192204120 19220412 WS1 NYA NYAWS1 4 0 0 4
BOS192204180 19220418 BOS NYA NYABOS 2 0 NYAWS1 2
NYA192204210 19220421 NYA WS1 WS1NYA 1 0 NYABOS 1
NYA192204220 19220422 NYA WS1 WS1NYA 2 1 WS1NYA 3
NYA192204230 19220423 NYA WS1 WS1NYA 0 2 WS1NYA 3
NYA192204250 19220425 NYA PHA PHANYA 1 0 WS1NYA 1
NYA192204260 19220426 NYA PHA PHANYA 4 1 PHANYA 5
NYA192204280 19220428 NYA BOS BOSNYA 0 0 PHANYA 0
NYA192204290 19220429 NYA BOS BOSNYA 6 1 BOSNYA 6
NYA192204300 19220430 NYA BOS BOSNYA 4 2 BOSNYA 10
NYA192205010 19220501 NYA BOS BOSNYA 2 3 BOSNYA 12
NYA192205020 19220502 NYA BOS BOSNYA 1 4 BOSNYA 13
语法图可能有点难以理解。但是documentation明确了window帧规范需要是常量:
<window frame preceding> ::= { UNBOUNDED PRECEDING | <unsigned_value_specification> PRECEDING | CURRENT ROW } . . . <unsigned value specification> ::= { <unsigned integer literal> }
因此,您无法使用 windows 框架规范来做您想做的事情。
你把它复杂化了。在 SUM
中使用 partition by
,这是预期的结果。
sum(strikeouts) over (partition by id order by game_dt)