I don’t know many developers to have not used Distinct in the queries at one time or the other. If you look up distinct in SQL Server Book it is defined as “Returns a set, removing duplicate tuples from a specified set.” True but not quite, when used for string column it also sorts the column alphabetically by default you like it or not.
Recently I came across a scenario where I needed to get distinct string values sorted by date time without sorting it in alphabetical order. I was dumb struck to find none of the SQL Server methods provided direct support to do so. I finally came up with the below mentioned process to achieve this, though would not say that it’s the best way forward, but till I find a better way, I am sharing the best I know.
DECLARE @Table1 TABLE
(
ID INT IDENTITY,
Value VARCHAR(50)
)
DECLARE @Table2 TABLE
(
ID INT IDENTITY,
Value VARCHAR(50)
)
INSERT INTO @Table1(Value)
Values('A')
INSERT INTO @Table1(Value)
Values('Z')
INSERT INTO @Table1(Value)
Values('B')
INSERT INTO @Table1(Value)
Values('F')
INSERT INTO @Table1(Value)
Values('A')
INSERT INTO @Table1(Value)
Values('F')
INSERT INTO @Table1(Value)
Values('N')
INSERT INTO @Table1(Value)
Values('C')
INSERT INTO @Table1(Value)
Values('N')
INSERT INTO @Table1(Value)
Values('B')
DECLARE @LOOP INT
DECLARE @COUNT INT
SET @LOOP =1
SELECT @COUNT = Count(*) FROM @TABLE1
WHILE @COUNT>=@Loop
BEGIN
DECLARE @VALUE VARCHAR(50)
SELECT @VALUE = VALUE From @TABLE1 Where mailto:ID=@Loop
IF NOT EXISTS (SELECT * FROM @TABLE2 Where VALUE = @VALUE)
BEGIN
INSERT INTO @TABLE2(VALUE)
VALUES (@VALUE)
END
SET @Loop = @Loop +1
END
SELECT * FROM @TABLE2
Please provide comments on the method defined. Also please enlighten me with any other approach that I have over looked.
Recently I came across a scenario where I needed to get distinct string values sorted by date time without sorting it in alphabetical order. I was dumb struck to find none of the SQL Server methods provided direct support to do so. I finally came up with the below mentioned process to achieve this, though would not say that it’s the best way forward, but till I find a better way, I am sharing the best I know.
(
ID INT IDENTITY,
Value VARCHAR(50)
)
DECLARE @Table2 TABLE
(
ID INT IDENTITY,
Value VARCHAR(50)
)
INSERT INTO @Table1(Value)
Values('A')
INSERT INTO @Table1(Value)
Values('Z')
INSERT INTO @Table1(Value)
Values('B')
INSERT INTO @Table1(Value)
Values('F')
INSERT INTO @Table1(Value)
Values('A')
INSERT INTO @Table1(Value)
Values('F')
INSERT INTO @Table1(Value)
Values('N')
INSERT INTO @Table1(Value)
Values('C')
INSERT INTO @Table1(Value)
Values('N')
INSERT INTO @Table1(Value)
Values('B')
DECLARE @LOOP INT
DECLARE @COUNT INT
SET @LOOP =1
SELECT @COUNT = Count(*) FROM @TABLE1
WHILE @COUNT>=@Loop
BEGIN
DECLARE @VALUE VARCHAR(50)
SELECT @VALUE = VALUE From @TABLE1 Where mailto:ID=@Loop
IF NOT EXISTS (SELECT * FROM @TABLE2 Where VALUE = @VALUE)
BEGIN
INSERT INTO @TABLE2(VALUE)
VALUES (@VALUE)
END
SET @Loop = @Loop +1
END
SELECT * FROM @TABLE2
Please provide comments on the method defined. Also please enlighten me with any other approach that I have over looked.