home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.databases.ms-sqlserver      Notorious Rube Goldberg contraption      19,505 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 18,867 of 19,505   
   migurus to rja.ca...@gmail.com   
   Re: need help with ordering groups of re   
   30 Apr 13 10:14:37   
   
   From: migurus@yahoo.com   
      
   On Wednesday, April 17, 2013 7:56:07 PM UTC-7, rja.ca...@gmail.com wrote:   
   > On Thursday, 18 April 2013 02:21:02 UTC+1, migurus  wrote:   
   >   
   > > I have a list of customers and addresses they have visited, each   
   >   
   > > record has a count of visits. I need to re-sort the list in such   
   >   
   > > a way that customers with higher counts will be higher on the list,   
   >   
   > > but all his/her records should stay together   
   >   
   > >   
   >   
   > > To illustrate:   
   >   
   > > declare @T table ( ID int, NAME varchar(32), ADDR varchar(32), CNT int );   
   >   
   > > insert into @T values   
   >   
   > > (1001, 'JOHN DOE', '100 MAIN ST', 200),   
   >   
   > > (1001, 'JOHN DOE', '2040 1ST ST',  50),   
   >   
   > > (1001, 'JOHN DOE', '1 WESTIN ST', 220),   
   >   
   > > (1225, 'BOB GARE', '50 GREEN ST', 195),   
   >   
   > > (1405, 'JUAN SILVA', '50 GREEN ST', 225),   
   >   
   > > (1405, 'JUAN SILVA', '300 PALM DR',  25);   
   >   
   > >   
   >   
   > > I need to get list ordered like below:   
   >   
   > >   
   >   
   > > ID	NAME	ADDR	CNT   
   >   
   > > 1405	JUAN SILVA	50 GREEN ST	225   
   >   
   > > 1405	JUAN SILVA	300 PALM DR	25   
   >   
   > > 1001	JOHN DOE	100 MAIN ST	200   
   >   
   > > 1001	JOHN DOE	2040 1ST ST	50   
   >   
   > > 1001	JOHN DOE	1 WESTIN ST	220   
   >   
   > > 1225	BOB GARE	50 GREEN ST	195   
   >   
   > >   
   >   
   > > As you see, Juan Silva has 225 visits, which is highest of them all,   
   >   
   > > so all his records are sorted before everybody else. The order of   
   >   
   > > records within group belonging to the same customer is not important.   
   >   
   >   
   >   
   > I take it it doesn't matter that Juan Silva has 25 visits at another   
   >   
   > address, and John Doe has 200, 50, and 220 visits at 3 addresses,   
   >   
   > which adds up to more than Juan Silva's 225 + 25.   
   >   
   >   
   >   
   > So - I'm not on the server just now, but, will this work?   
   >   
   >   
   >   
   > SELECT CUSTOMER.ID, CUSTOMER.NAME, CUSTOMER.ADDR, CUSTOMER.CNT   
   >   
   > FROM   
   >   
   > @T CUSTOMER   
   >   
   > JOIN   
   >   
   >     (   
   >   
   >     SELECT ID, MAX(CNT) AS MAX_VISITS FROM @T GROUP BY ID   
   >   
   >     )   
   >   
   >     MAX_VISITS   
   >   
   > ON   
   >   
   > ( CUSTOMER.ID = MAX_VISITS.ID )   
   >   
   > ORDER BY   
   >   
   >       MAX_VISITS.MAX_VISITS DESC   
   >   
   >     ,   
   >   
   >       CUSTOMER.CNT DESC   
   >   
   >   
   >   
   > -- I think if you /do/ want to give John Doe a count of 470 visits   
   >   
   > -- for ranking, then you just need to use SUM(CNT) instead of MAX(CNT).   
   >   
   > -- And probably change MAX_VISITS to ALL_VISITS or something.   
   >   
   > --   
   >   
   > -- And indexes... well, a non-unique index on ID, anyway.   
   >   
   > -- Or a unique index on (ID, ADDR), but that's bad.  Is there   
   >   
   > -- an ADDR_ID column that you could pick up?  And if you put CNT in   
   >   
   > -- there too, it looks crazy and it makes updates slower but   
   >   
   > -- I think it helps this query.  Or, just create the table of   
   >   
   > -- MAX_VISITS.   
   >   
   > --   
   >   
   > -- In recent editions of SQL Server, you can also pre-define sub-queries   
   >   
   > -- by starting a statement with the keyword "WITH"; confusingly,   
   >   
   > -- WITH is also used to introduce "hints", so, make sure you get   
   >   
   > -- the /right/ page in the manual.  It's late here and I don't remember   
   >   
   > -- how it goes, sorry ;-)   
      
   Thank you, your solution works   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca