|
|
|
SSC Veteran
      
Group: General Forum Members
Last Login: Tuesday, April 09, 2013 5:55 AM
Points: 225,
Visits: 262
|
|
What is the best way to get a list of all numbers between low and high numbers? Thanks.
Actually >= low, <= high
CREATE TABLE #TempBet (High int, Low int)
INSERT INTO #TempBet (High, Low) SELECT 1, 3 UNION ALL SELECT 2, 3 UNION All SELECT 5, 8
RESULT
Low High Bet 1 3 1 1 3 2 1 3 3 2 3 2 2 3 3 5 8 5 5 8 6 5 8 7 5 8 8
|
|
|
|
|
SSC Veteran
      
Group: General Forum Members
Last Login: Tuesday, April 09, 2013 5:55 AM
Points: 225,
Visits: 262
|
|
Reworked another forum solution
DROP TABLE #TempBet
CREATE TABLE #TempBet (Id int, Low int, High int)
INSERT INTO #TempBet (Id, Low, High) SELECT 1, 1, 3 UNION ALL SELECT 2, 2, 3 UNION All SELECT 3, 5, 8
; WITH Info (Id, Low, High, Result) AS ( SELECT Id, Min(Low), Max(High), Min(Low) FROM #TempBet GROUP BY Id UNION ALL SELECT Id, Low, High, Result + 1 FROM Info WHERE Result < High ) SELECT * FROM Info ORDER BY Id, Result
|
|
|
|
|
SSC Veteran
      
Group: General Forum Members
Last Login: Tuesday, April 09, 2013 5:55 AM
Points: 225,
Visits: 262
|
|
When I use larger numbers I get this error "types don't match between the anchor and the recursive part"
CREATE TABLE #TempBet (Id int, Low numeric, High numeric)
INSERT INTO #TempBet (Id, Low, High) SELECT 1, 10000000000, 30000000000 UNION ALL SELECT 2, 20000000000, 30000000000 UNION All SELECT 3, 50000000000, 80000000000
; WITH Info (Id, Low, High, Result) AS ( SELECT Id, Min(Low), Max(High), Min(Low) FROM #TempBet GROUP BY Id UNION ALL SELECT Id, Low, High, Result + 1 FROM Info WHERE Result < High ) SELECT * FROM Info ORDER BY Id, Result
|
|
|
|
|
Ten Centuries
      
Group: General Forum Members
Last Login: Yesterday @ 6:46 PM
Points: 1,074,
Visits: 1,076
|
|
cast ((Result+1) as numeric) If you use Int ,in this case BigInt , then you won't be seeing this error...
~ demonfox ___________________________________________________________________ Wondering what I would do next , when I am done with this one
|
|
|
|
|
SSC-Dedicated
           
Group: General Forum Members
Last Login: Today @ 12:30 PM
Points: 32,893,
Visits: 26,770
|
|
texpic (8/4/2012)
When I use larger numbers I get this error "types don't match between the anchor and the recursive part" CREATE TABLE #TempBet (Id int, Low numeric, High numeric)
INSERT INTO #TempBet (Id, Low, High) SELECT 1, 10000000000, 30000000000 UNION ALL SELECT 2, 20000000000, 30000000000 UNION All SELECT 3, 50000000000, 80000000000
; WITH Info (Id, Low, High, Result) AS ( SELECT Id, Min(Low), Max(High), Min(Low) FROM #TempBet GROUP BY Id UNION ALL SELECT Id, Low, High, Result + 1 FROM Info WHERE Result < High ) SELECT * FROM Info ORDER BY Id, Result
The first item will produce a list of 20 Billion numbers, the second 10 Billion, and the 3rd 30 Billion for a total of 60 Billion numbers (rows).
With that in mind, I have to ask... what is the purpose of this exercise and what do you expect to do with 60 Billion rows?
--Jeff Moden "RBAR is pronounced "ree-bar" and is a "Modenism" for "Row-By-Agonizing-Row".
First step towards the paradigm shift of writing Set Based code: Stop thinking about what you want to do to a row... think, instead, of what you want to do to a column."
For better, quicker answers on T-SQL questions, click on the following... http://www.sqlservercentral.com/articles/Best+Practices/61537/
For better answers on performance questions, click on the following... http://www.sqlservercentral.com/articles/SQLServerCentral/66909/
|
|
|
|
|
SSC Veteran
      
Group: General Forum Members
Last Login: Tuesday, April 09, 2013 5:55 AM
Points: 225,
Visits: 262
|
|
Jeff:
It was a bad example. The number of combinations between the true numbers is about 50,000 each. I'll try it with 50,000 each on the span and see if I get the error still.
|
|
|
|
|
SSC Veteran
      
Group: General Forum Members
Last Login: Tuesday, April 09, 2013 5:55 AM
Points: 225,
Visits: 262
|
|
I have a reference table that I was given that has 50,000 records. It has ranges between two 11-digit numbers. I need to makes sure there are no overlaps. I was going to try and get the list of all the numbers in between the two ranges, then simply make sure they were all distinct.
For this example I cleaned up the ranges so they were less than 50,000 each; overlap is on purpose between the 2 lines. Changed all the numeric to bigint.
New error now, "Msg 530, Level 16, State 1, Line 12 The statement terminated. The maximum recursion 100 has been exhausted before statement completion."
-- DROP TABLE #TempBet
CREATE TABLE #TempBet (Id int, Low bigint, High bigint)
INSERT INTO #TempBet (Id, Low, High) SELECT 1, 10000050000, 10000080000 UNION ALL SELECT 2, 10000070000, 10000090000 UNION All SELECT 3, 50000050000, 50000090000 UNION All SELECT 4, 50000060000, 50000070000
; WITH Info (Id, Low, High, Result) AS ( SELECT Id, Min(Low), Max(High), Min(Low) FROM #TempBet GROUP BY Id UNION ALL SELECT Id, Low, High, CAST(Result + 1 as bigint) FROM Info WHERE Result < High ) SELECT * FROM Info ORDER BY Id, Result
|
|
|
|
|
SSCrazy
      
Group: General Forum Members
Last Login: 2 days ago @ 12:42 AM
Points: 2,338,
Visits: 3,158
|
|
|
|
|
|
Ten Centuries
      
Group: General Forum Members
Last Login: Yesterday @ 6:46 PM
Points: 1,074,
Visits: 1,076
|
|
texpic (8/5/2012) New error now, "Msg 530, Level 16, State 1, Line 12 The statement terminated. The maximum recursion 100 has been exhausted before statement completion."
use MAXRECURSION hint. check this out: http://msdn.microsoft.com/en-us/library/ms186243(v=SQL.105).aspx
~ demonfox ___________________________________________________________________ Wondering what I would do next , when I am done with this one
|
|
|
|
|
SSC-Dedicated
           
Group: General Forum Members
Last Login: Today @ 12:30 PM
Points: 32,893,
Visits: 26,770
|
|
texpic (8/5/2012)
I have a reference table that I was given that has 50,000 records. It has ranges between two 11-digit numbers. I need to makes sure there are no overlaps. I was going to try and get the list of all the numbers in between the two ranges, then simply make sure they were all distinct. For this example I cleaned up the ranges so they were less than 50,000 each; overlap is on purpose between the 2 lines. Changed all the numeric to bigint. New error now, "Msg 530, Level 16, State 1, Line 12 The statement terminated. The maximum recursion 100 has been exhausted before statement completion." -- DROP TABLE #TempBet
CREATE TABLE #TempBet (Id int, Low bigint, High bigint)
INSERT INTO #TempBet (Id, Low, High) SELECT 1, 10000050000, 10000080000 UNION ALL SELECT 2, 10000070000, 10000090000 UNION All SELECT 3, 50000050000, 50000090000 UNION All SELECT 4, 50000060000, 50000070000
; WITH Info (Id, Low, High, Result) AS ( SELECT Id, Min(Low), Max(High), Min(Low) FROM #TempBet GROUP BY Id UNION ALL SELECT Id, Low, High, CAST(Result + 1 as bigint) FROM Info WHERE Result < High ) SELECT * FROM Info ORDER BY Id, Result
A recursive CTE may be a bit of overkill for this. Do you need to ensure there are no gaps, as well?
--Jeff Moden "RBAR is pronounced "ree-bar" and is a "Modenism" for "Row-By-Agonizing-Row".
First step towards the paradigm shift of writing Set Based code: Stop thinking about what you want to do to a row... think, instead, of what you want to do to a column."
For better, quicker answers on T-SQL questions, click on the following... http://www.sqlservercentral.com/articles/Best+Practices/61537/
For better answers on performance questions, click on the following... http://www.sqlservercentral.com/articles/SQLServerCentral/66909/
|
|
|
|