Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.databases.ms-sqlserver > #1460
| Newsgroups | comp.databases.ms-sqlserver |
|---|---|
| Date | 2013-04-30 10:14 -0700 |
| References | <c2fb326a-1dee-4d93-b41e-16e00868c506@googlegroups.com> <be35d149-e627-4978-9ed3-800bc76d08eb@googlegroups.com> |
| Message-ID | <ebf3db82-4453-4a65-8220-cd766e0a129a@googlegroups.com> (permalink) |
| Subject | Re: need help with ordering groups of records |
| From | migurus <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
Back to comp.databases.ms-sqlserver | Previous | Next — Previous in thread | Next in thread | Find similar
need help with ordering groups of records migurus <migurus@yahoo.com> - 2013-04-17 18:21 -0700
Re: need help with ordering groups of records rja.carnegie@gmail.com - 2013-04-17 19:56 -0700
Re: need help with ordering groups of records migurus <migurus@yahoo.com> - 2013-04-30 10:14 -0700
Re: need help with ordering groups of records Gints Plivna <gints.plivna@gmail.com> - 2013-04-23 05:19 -0700
Re: need help with ordering groups of records migurus <migurus@yahoo.com> - 2013-04-30 10:13 -0700
Re: need help with ordering groups of records rja.carnegie@gmail.com - 2013-04-30 11:37 -0700
csiph-web