如何解决根据两列中的相同值将“迭代次数”列添加到SQL Select中
我有一条SQL(SQL Server)语句SELECT id,animalId,ownerId FROM myTable ORDER BY id
,它输出以下数据:
id | animalId | ownerId
------------------------
1 | 123 | 62
2 | 123 | 182
3 | 240 | 27
4 | 2 | 30
5 | 73 | 35
6 | 123 | 62
7 | 108 | 162
8 | 2 | 30
9 | 2 | 30
10 | 73 | 35
我想做的是动态添加第四列,该第四列用作具有动物id和ownerId相同值的每一行的计数器。因此,结果输出为:
id | animalId | ownerId | iterator
-----------------------------------
1 | 123 | 62 | 1 <-- First instance where animalId is 123 and ownerId is 62
2 | 123 | 182 | 1
3 | 240 | 27 | 1
4 | 2 | 30 | 1
5 | 73 | 35 | 1
6 | 123 | 62 | 2 <-- Second instance where animalId is 123 and ownerId is 62
7 | 108 | 162 | 1
8 | 2 | 30 | 2
9 | 2 | 30 | 3
10 | 73 | 35 | 2
有人可以建议如何解决吗?
非常感谢。
解决方法
如果您特别想对给定点上123/62对的出现进行计数(如代码中的注释所示),则可以使用累积和:
select t.*,sum(case when ownerid = 62 and animalid = 123 then 1 else 0 end) over (order by id) as iterator
from t;
更合理地说,您希望所有的货币对都使用此货币。因此,请使用row_number()
:
select t.*,row_number() over (partition by ownerid,animalid order by id) as iterator
from t;
,
您可以使用窗口函数ROW_NUMBER()来做到这一点:
SELECT id,animalId,ownerId,ROW_NUMBER() OVER (PARTITION BY animalId,ownerId ORDER BY id) iterator
FROM myTable
ORDER BY id
请参见demo。
结果:
> id | animalId | ownerId | iterator
> -: | -------: | ------: | -------:
> 1 | 123 | 62 | 1
> 2 | 123 | 182 | 1
> 3 | 240 | 27 | 1
> 4 | 2 | 30 | 1
> 5 | 73 | 35 | 1
> 6 | 123 | 62 | 2
> 7 | 108 | 162 | 1
> 8 | 2 | 30 | 2
> 9 | 2 | 30 | 3
> 10 | 73 | 35 | 2
,
假设您想要的结果按ID的顺序排列。 请在下面找到基于纯ANSI SQL语法的解决方案。
创建表格
create table animalOwners( id int,animalId int,ownerId int );
**插入数据**
insert into animalOwners values (1,123,62);
insert into animalOwners values(2,182);
insert into animalOwners values(3,240,27);
insert into animalOwners values(4,2,30);
insert into animalOwners values(5,73,35);
insert into animalOwners values(6,62);
insert into animalOwners values(7,108,162);
insert into animalOwners values(8,30);
insert into animalOwners values(9,30);
insert into animalOwners values(10,35);
SQL解决方案:
select
id,animalID,(
select
count(*)
from
animalOwners innerTable
where innerTable.id <= outerTable.id
and innerTable.animalId = outerTable.animalId
and innerTable.ownerId = outerTable.ownerId ) as counter
from
animalOwners outerTable
order by
id;
如果运行此命令,将获得预期的输出。
,您要查找的术语是“窗口功能”。您可以对组中的成员进行排序(row_number超过(按列划分按列排序),计数组的成员(count(1)超过(按列划分)),对它们进行排名,求和,取平均值,等等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。