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,860 of 19,505    |
|    rja.carnegie@gmail.com to migurus    |
|    Re: need help with ordering groups of re    |
|    17 Apr 13 19:56:07    |
      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 ;-)              --- 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