我正在尝试使用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中找不到限制?
谢谢!
答案 0 :(得分:2)
您似乎希望对10个以上的值进行累计计数:
select mynum,
sum(case when mynum >= 10 then 1 else 0 end) over (order by id) as seqno
from myt1;
Here是db <>小提琴。
请注意,SQL表表示无序集。您的查询假设该表的顺序-在一般SQL或任一数据库中均无效。您的查询确实似乎可以在MySQL中工作,但不能保证。
我添加了一个id
列以捕获顺序,因此该查询将起作用。
顺便说一句,这也是MySQL 8+中的首选方法。不建议使用变量。