SERIAL 用于另一列中的每个值
SERIAL for each value in another column
我想让一列成为一个自动递增的序列,它在其他列的值内累加。
例如
| flav | count|
| 'choc' | 1 |
| 'choc' | 2 |
|'banana'| 1 |
| 'choc' | 3 |
|'banana'| 2 |
| 'mint' | 1 |
|'banana'| 3 |
| ... | ... |
单独的行插入当然可以通过 2 个单独的查询来实现,一个 SELECT COUNT 后跟一个 INSERT,但这不允许高效的批量插入,我相信有更好的方法。
我希望能够只执行 INSERT INTO orders (flav) VALUES ('choc');
并让架构处理 count
列,就像它处理自动递增列一样。
我试图为模式中的 count
列定义一个 DEFAULT 表达式,这将是一个 SELECT COUNT 查询,但没有骰子:ERROR: cannot use subquery in DEFAULT expression
.
使用window函数row_number。
with flavor_list (flavor) as
( values
( 'choc' )
, ( 'choc' )
, ('banana')
, ( 'choc' )
, ('banana')
, ( 'mint' )
, ('banana')
)
select flavor, row_number() over(partition by flavor)
from flavor_list;
我想让一列成为一个自动递增的序列,它在其他列的值内累加。
例如
| flav | count|
| 'choc' | 1 |
| 'choc' | 2 |
|'banana'| 1 |
| 'choc' | 3 |
|'banana'| 2 |
| 'mint' | 1 |
|'banana'| 3 |
| ... | ... |
单独的行插入当然可以通过 2 个单独的查询来实现,一个 SELECT COUNT 后跟一个 INSERT,但这不允许高效的批量插入,我相信有更好的方法。
我希望能够只执行 INSERT INTO orders (flav) VALUES ('choc');
并让架构处理 count
列,就像它处理自动递增列一样。
我试图为模式中的 count
列定义一个 DEFAULT 表达式,这将是一个 SELECT COUNT 查询,但没有骰子:ERROR: cannot use subquery in DEFAULT expression
.
使用window函数row_number。
with flavor_list (flavor) as
( values
( 'choc' )
, ( 'choc' )
, ('banana')
, ( 'choc' )
, ('banana')
, ( 'mint' )
, ('banana')
)
select flavor, row_number() over(partition by flavor)
from flavor_list;