我想在变量中存储前一行的列值,然后将此变量值与当前行的列进行比较。在mysql中,例如sqlfiddle
所以让我们举一个与在sql小提琴中加载的相同的简单示例
create table align1 (col1 varchar(100),col2 varchar(100));
insert into align1 values ('1','1');
insert into align1 values ('1','1');
insert into align1 values ('10','1');
insert into align1 values ('100','1');
我想要实现的是,如果col1的值对于前一行和当前行是相同的,则增加
查询:
select col1,col2,if(@temp1=col1,@i:=@i+1, @i:=1) as _keycol,@temp1:=col1 from align1,(select @temp1:=null,@i:=0)t
mysql中的一切都很完美。
现在我想在sql server中实现相同的查询。
在mysql中我使用了session变量,所以我不需要声明,但在sql server中我需要先声明。
我在sql server 2012中尝试了以下查询,sqlfiddle
declare @temp1 varchar(1024)='',@i int =0
select col1,col2,case when @temp1=col1 then @i=@i+1 else @i=1 end as _keycol,@temp1=col1 from align1;
我无法执行上述查询,它给了我错误:
Incorrect syntax near '='.
然后我只是尝试增加数字以确保我能够在select查询中增加变量值。sqlfiddle:
declare @i int =0
select col1,@i=@i+1 from align1
我收到了错误:
A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations
即使我使用LAG(),我如何在select语句中有条件地增加或重置变量。
所以我想在sql server 2012中获得与mysql相同的结果。
提前谢谢..
答案 0 :(得分:0)
试试这个。它在SQL Server 2012的SSMS查询窗口中对我有用。(这是我第一次在这里发帖,所以请原谅我,如果格式不正确的话!)
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
create table align1 (col1 varchar(100),col2 varchar(100));
insert into align1 values ('1','1');
insert into align1 values ('1','1');
insert into align1 values ('10','1');
insert into align1 values ('100','1');
insert into align1 values ('100','1');
insert into align1 values ('300','1');
insert into align1 values ('500','1');
insert into align1 values ('500','1');
DECLARE @count INT = 0;
DECLARE @prev VARCHAR(100);
DECLARE @current VARCHAR(100);
DECLARE @i INT = 0;
SELECT @count = count(*) from align1
SELECT * INTO #temp FROM align1
SET @current = (SELECT TOP 1 col1 FROM #temp)
DELETE TOP (1) FROM #temp
WHILE @Count > 0
BEGIN
SET @prev = @current;
SET @current = (SELECT TOP 1 col1 From #temp)
IF @current = @prev
BEGIN
SET @i = @i + 1;
END
DELETE TOP (1) FROM #temp;
SET @Count = @Count - 1;
END
PRINT '@i = ' + CONVERT(VARCHAR,@i)
结果:
@i = 3