sql—行数函数的计算列公式

4zcjmb1e  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(395)

我试图找到一个计算列的公式,它将返回与 ROW_NUMBER() 功能。因为我不能使用 ROW_NUMBER() 函数并将结果保存在表中。我有一张table如下;

ID  YEAR  
1   2018      
2   2018      
3   2019      
4   2019      
5   2020      
6   2018      
7   2019

我想一个公式,将计算和分配的行数取决于年如下所示;

ID     YEAR     COMPUTED COLUMN
1      2018     1
2      2018     2  
3      2019     1  
4      2019     2  
5      2020     1  
6      2018     3  
7      2019     3
omhiaaxx

omhiaaxx1#

我试图找到一个计算列的公式,它将返回与row\ u number()函数相同的结果。
只是不能在计算列中使用窗口函数;窗口函数对一系列行(称为窗口框架)进行操作,而计算列只对它所属的行具有可见性。
我无法使用row\ u number()函数将结果保存到表中
虽然这在技术上是可行的,但我不建议这样做。这是派生的信息,可以随时计算需要。您可以改用视图:

create view myview
as
select
    id, 
    year,
    row_number() over (partition by year order by id) rn
from mytable
mznpcxlj

mznpcxlj2#

总有办法解决的。
但这不是个好办法。。。

select
    id, 
    year,
    row_number() over(partition by year order by id) rn,
    (select count(*) from Table1 t where t.YEAR=d.YEAR and t.ID<=d.ID) PoorRN
from Table1 d
order by id

•这将有一个非常糟糕的表现。如果您的表有超过一百万行—只需在生产中继续浏览,并告诉我们发生了什么;)

pdsfdshx

pdsfdshx3#

更新:根据op的评论,我有一个新的建议-
从原来的表中创建一个视图,然后给每年的数据
create view original_table_view as select*,row_number()over(partition by[year]order by id)作为原始_table的编号
从视图中创建新表并对新表应用合并
创建新表\u table(id int,[年]int,编号int)
创建合并语法-

merge new_table t using original_table_view v
on (t.id = v.id) --merge_condition 
when matched then update set 
t.[year]=v.[year],
t.numbering=v.numbering
when not matched by target
then insert ( id, [year], numbering)
values (v.id, v.[year],numbering)
when not matched by source
then delete;

因此,如果将来在原始表中插入新值,则只需运行合并查询来更新新表。
查看数据-

select * from original_table order by ID
select * from original_table_view order by ID
select * from New_table order by ID

旧答案:我把你的查询和计算列而不是计算列混淆了(很抱歉)
不能将函数存储为sql server中的计算列。但是,您可以在表上创建一个视图,然后调用该视图。
示例-
创建如下表

create table year_computed2 (ID int, Year int )
go

insert into year_computed2 values (1,2018 )
insert into year_computed2 values (2,2018 )
insert into year_computed2 values (3,2019 )
insert into year_computed2 values (4,2019 )
insert into year_computed2 values (5,2020 )
insert into year_computed2 values (6,2018 )
insert into year_computed2 values (7,2019 )
go

现在使用row\u number()函数创建一个视图(也可以使用rank()和ntile())

alter view year_computed_view as
select *, ROW_NUMBER() over ( partition by [year] order by ID) as Rn from year_computed2

现在像下面这样查询这个视图

select * from year_computed_view order by ID

在此处输入图像描述
如果你说的是计算列-下面的答案是可用的 Dense_Rank() ```
select DISTINCT id, [year], DENSE_RANK() over ( order by [year]) as [Dense_rank]
from year_computed
ORDER BY ID

输出如下:
![](https://i.stack.imgur.com/Da2H4.jpg)
如果你的排名不满足,那么尝试以下两个功能-
排名()
选择distinct id,[year],rank()over(partition by[year]order by id)作为从year\u计算的order by id的[rank]
在此处输入图像描述
名称()
声明@ntile\u count int=(select count(distinct[year])from year\u computed)select id,[year],ntile(@ntile\u count)over(partition by[year]order by id)为rn from year\u computed order by id
在此处输入图像描述

相关问题