Quantcast
Channel: SQL Server Blog
Viewing all articles
Browse latest Browse all 1849

SQL: Different ways to generate sequence

$
0
0

There was a question from the op regarding adding a new column to a query output by generating the cyclic sequence numbers from 1 to 3.

Select A =identity(int,1,1),B,C from table_abs

1,A,41

2,B,13

3,C,90

4,D,91

5,E,98

6,F,12

7,G,54

8,H,16

For this output, the 4th column generates the Sequence of numbers from 1 to 3 which is shown below

1,A,41,1

2,B,13,2

3,C,90,3

4,D,91,1

5,E,98,2

6,F,12,3

7,G,54,1

8,H,16 ,2

If you are using SQL 2012 then Sequence would be natural choice for any such operations.

Solution 1

Using Sequence

CREATE SEQUENCE Seq
 AS INTEGER
 START WITH1
 INCREMENT BY1
 MINVALUE 1
 MAXVALUE 3
 CYCLE;SELECT table_name,NEXT VALUE FOR Seq New_column
FROM information_schema.tables

 

Solution 2

Using CTE and Modulus operator

;with q as(select row_number()over(orderby(selectnull)) A,*from sys.objects
)select A,1+A%3 B,*from q

Solution 3

Loops and Temp table

createtable dummyTest
(
id int, 
col1 char(1),
col2 int
)insertinto dummyTest values(1,'A',410),(2,'B',411),(3,'c',4111),(4,'d',421),(5,'e',441),(6,'f',451),(7,'g',481),(8,'h',401)createtable#dummy(
id int, 
col1 char(1),
col2 int,
NewColumn int
)declare@n int,@i int,@limit int
 set@limit=1set@i=1select@n=count(*)from dummyTest
 while@i<=@n
 beginset@limit=1while@limit<=3beginprint@limit
 insertinto#dummyselect*,NewColumn=@limit from dummyTest where id=@i
 set@i=@i+1set@limit=@limit+1endendselect*from#dummy

 

Conclusion

The same solution can be derived using the cursor and there may be other solutions as well. At many instances, we opt for any solutions without thinking of data volume that may degrade the performance. This is one of the prime examples of why we need to upgrade to newer version.

 

 

 



Viewing all articles
Browse latest Browse all 1849

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>