Recent PostsRecent Posts Popular TopicsPopular Topics
 Home Search Members Calendar Who's On

 Solve Problems Using Recursive CTE Rate Topic Display Mode Topic Options
Author
 Message
 Posted Thursday, December 06, 2012 10:08 AM
 Forum Newbie Group: General Forum Members Last Login: Thursday, December 13, 2012 6:34 PM Points: 6, Visits: 58
 [quote]mickyT (12/5/2012)So comparing the islands and recursive queries returning similar rows`;WITH cte AS ( SELECT name, DATEADD(mm, - ROW_NUMBER() OVER (ORDER BY name, saledate), saledate) dategroup, saledate FROM #sales WHERE quantity > 2 and saledate >= '2012-01-01' )SELECT name, max(saledate), COUNT(*)FROM cteGROUP BY name, dategroupHAVING COUNT(*) > 1 ORDER BY name, dategroup;with m2_cte_f (name,saledate,quantity,ind) as (select s.*, 0 as indfrom #sales swhere s.saledate='2012-01-01'union allselect s.*, case when s.quantity > 2 and sc.quantity > 2 then 1 else 0 end as indfrom #sales sinner join m2_cte_f sc on (s.saledate = dateadd(month,1,sc.saledate) and s.name=sc.name)where sc.ind = 0 )select * from m2_cte_f where ind=1 `I get the following IO stats (timing not worth mentioning 1ms each) for the small test set`(3 row(s) affected)Table '#sales____00000000009F'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.(3 row(s) affected)Table 'Worktable'. Scan count 2, logical reads 91, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.Table '#sales____00000000009F'. Scan count 2, logical reads 14, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.`Upping the stakes a tiny bit by putting a moderate amount of data (3000 odd rows) into the table`INSERT INTO #sales (name, saledate)SELECT *FROM (SELECT * FROM (VALUES('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T')) as sales(name)) names, (SELECT TOP 156 dateadd(mm, N, '1999-12-01') saledate FROM Tally) as months UPDATE #salesSET quantity = RAND(Checksum(Newid())) * 5CREATE CLUSTERED INDEX SALES_IDX1 ON #sales (saledate, name)`Thanks for all updates on this topic.I have one question for this test.It seems the test data starts at 1999-12-01, but queries use '2012-01-01' to start. I am not sure what the end date is.I was wondering if it makes any difference after we make some change on start date in these 2 queries, so that start date = the earlies test date, then sorting may go through all period for query 1. Of course, recursion will have more joins for query 2.
Post #1393632
 Posted Thursday, December 06, 2012 11:35 AM
 SSChasing Mays Group: General Forum Members Last Login: Today @ 7:36 PM Points: 604, Visits: 1,998
 bj_shenglongI have one question for this test.It seems the test data starts at 1999-12-01, but queries use '2012-01-01' to start. I am not sure what the end date is.I was wondering if it makes any difference after we make some change on start date in these 2 queries, so that start date = the earlies test date, then sorting may go through all period for query 1. Of course, recursion will have more joins for query 2.I put the date into the query to make the Island query similar to the last query you posted. That query will only report the first consecutive month for each name, however the Island query will report all consecutive months in the period for a name. For exampleA 2000-01-01 2 A 2000-02-01 3A 2000-03-01 4 <-- Returned by RecursiveA 2000-04-01 3 <-- Returned By IslandA 2000-05-01 1A 2000-06-01 2A 2000-07-01 1A 2000-08-01 3A 2000-09-01 3A 2000-10-01 3A 2000-11-01 4 <-- Returned By Island A 2000-12-01 2What I found interesting was even though I was only adding data prior to those dates the recursive query kept getting more expensive.
Post #1393675
 Posted Thursday, December 06, 2012 12:28 PM
 Forum Newbie Group: General Forum Members Last Login: Thursday, December 13, 2012 6:34 PM Points: 6, Visits: 58
 I put the date into the query to make the Island query similar to the last query you posted. That query will only report the first consecutive month for each name, however the Island query will report all consecutive months in the period for a name. For exampleThat is what I said in previous post. This perticular task is to find when someone are qualified at his first time. So, recursion will search at beginning and stop searching after reaching the goal.
Post #1393700
 Posted Thursday, December 06, 2012 1:04 PM
 SSC-Dedicated Group: General Forum Members Last Login: Today @ 6:24 PM Points: 34,557, Visits: 28,738
 bj_shenglong (12/6/2012)I put the date into the query to make the Island query similar to the last query you posted. That query will only report the first consecutive month for each name, however the Island query will report all consecutive months in the period for a name. For exampleThat is what I said in previous post. This perticular task is to find when someone are qualified at his first time. So, recursion will search at beginning and stop searching after reaching the goal.I've haven't looked at the queries in any great detail but I'm thinking that add TOP 1 would easily solve such a problem. --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." "Change is inevitable. Change for the better is not." -- 04 August 2013(play on words) "Just because you CAN do something in T-SQL, doesn't mean you SHOULDN'T." --22 Aug 2013Helpful Links:How to post code problemsHow to post performance problems
Post #1393720

 Permissions