我正在尝试更新我的sql查询技能,我已经有很多年没有用过它了。
在做一些练习的时候,我遇到了一个问题,这个问题在MySql中很容易解决,但在sql server中就更复杂了。我想知道有没有更简单的方法。
为了这个问题,我将过度简化问题(以避免复杂的代码)。
所以,我有一个数字序列。在这个序列中,我想识别和编号小于10的数字的子序列。当满足数字>= 10时,由seqno计数器识别的新的子序列开始。在mysql查询+结果下面
create table myt1(mynum int);
insert into myt1 values (13), (5), (8), (15), (2), (5), (18), (3), (6), (9), (8), (12);
set @seqno = 0;
select mynum, @seqno := case when mynum < 10 then @seqno else @seqno+1 end as seqno
from myt1

现在,对于SQL server,事情变得更加复杂,因为不允许在同一个SELECT语句中进行数据检索和变量赋值。为了获得相同的结果,我的变通方法是将表复制到具有附加列的临时表中,然后使用以下代码更新表/列
create table myt1(mynum int);
insert into myt1 values (13), (5), (8), (15), (2), (5), (18), (3), (6), (9), (8), (12);
select *, 1 as seqno
into #tempt1
from myt1
declare @seqno int;
set @seqno = 0;
update #tempt1
set
seqno = @seqno,
@seqno = case when mynum < 10 then @seqno else @seqno+1 end
select * from #tempt1谁能告诉我在mssql中有没有更简单的方法来编写这个查询,为什么会有mysql中没有的限制?
谢谢!
发布于 2019-11-02 04:26:21
您似乎想要一个超过10的值的累积计数:
select mynum,
sum(case when mynum >= 10 then 1 else 0 end) over (order by id) as seqno
from myt1; Here是一个db<>fiddle。
请注意,SQL表表示无序集合。您的查询假设表的排序--这在一般的SQL或任何数据库中都是无效的。您的查询似乎确实可以在MySQL中工作,但这并不能保证。
我已经添加了一个id列来捕获排序,因此查询将正常工作。
顺便说一句,这也是MySQL 8+中的首选方法;变量的使用正在被弃用。
https://stackoverflow.com/questions/58664606
复制相似问题