| Author |
Topic |
|
mangaug
Starting Member
2 Posts |
Posted - 2009-11-19 : 02:26:35
|
| There are two tables: Vol and Vol_typeThe Vol look like:sd q ts tp10/16/2009 600 10/17/2009 B10/16/2009 500 10/18/2009 B10/16/2009 500 10/18/2009 A10/17/2009 600 10/18/2009 B10/17/2009 500 10/19/2009 B10/17/2009 500 10/19/2009 AThe Vol_type look like:tp rankA 1B 2for each distinct sd available in Vol table, first need to see the max rank, if there are two values then I need to take the latest ts.The output should be:sd q ts tp10/16/2009 500 10/18/2009 B10/17/2009 500 10/19/2009 BPlease help me how to write sql query to I get this. |
|
|
bklr
Master Smack Fu Yak Hacker
1693 Posts |
Posted - 2009-11-19 : 04:09:46
|
| [code]SELECT s.sd,s.q,s.ts,vt.tp FROM (SELECT v.sd,v.q,v.ts,MAX(vt.rank ) AS rankFROM (SELECT sd,Max(ts)as ts FROM @vol GROUP BY sd )sINNER JOIN @vol v on v.sd= s.sd and v.ts = s.ts LEFT JOIN @vol_type vt ON vt.tp = v.tpGROUP BY v.sd,v.q,v.ts)S INNER JOIN @vol_type vt ON vt.rank = s.rank [/code] |
 |
|
|
rajdaksha
Aged Yak Warrior
595 Posts |
Posted - 2009-11-19 : 04:15:49
|
HiTry this..CREATE TABLE #VOL(SD DATETIME ,Q INT, TS DATETIME ,TP CHAR(1))INSERT INTO #VOLSELECT '10/16/2009', 600 ,'10/17/2009', 'B' UNION ALLSELECT '10/16/2009', 500 ,'10/18/2009', 'B' UNION ALLSELECT '10/16/2009', 500 ,'10/18/2009', 'A' UNION ALLSELECT '10/17/2009', 600 ,'10/18/2009', 'B' UNION ALLSELECT '10/17/2009', 500 ,'10/19/2009', 'B' UNION ALLSELECT '10/17/2009', 500 ,'10/19/2009', 'A'CREATE TABLE #VOL_TYPE(TP CHAR(1), RANK_ID INT)INSERT INTO #VOL_TYPESELECT 'A', 1 UNION ALLSELECT 'B', 2SELECT * FROM #VOLSELECT * FROM #VOL_TYPESELECT TP,SD, Q, TSFROM (SELECT B.TP, A.SD, A.Q, A.TS, ROW_NUMBER() OVER (PARTITION BY SD ORDER BY Q) AS RECIDFROM #VOL A, #VOL_TYPE B WHERE A.TP = B.TP) AS DWHERE RECID = 1 -------------------------R... |
 |
|
|
Nageswar9
Aged Yak Warrior
600 Posts |
Posted - 2009-11-19 : 04:21:08
|
| Hi, Try thisDECLARE @max_rank INT, @Max_vol VARCHAR(32)SELECT @max_rank = ( SELECT MAX(ranks) FROM @vol )SELECT @Max_vol = ( SELECT tp FROM @vol WHERE ranks = @max_rank)SELECT sd , q , ts , tp FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY sd ORDER BY q,ts,tp DESC ) AS rid FROM @temp WHERE tp = @Max_vol) xWHERE x.rid = 1 |
 |
|
|
sql-programmers
Posting Yak Master
190 Posts |
Posted - 2009-11-23 : 10:30:20
|
| Try to use this querycreate table #temp(sd varchar(100),Rank int,TS varchar(100))insert into #temp select sd,max(rank) as Rank,max(ts)from dbo.Vol inner join Vol_type on Vol_type.tp=Vol.tpgroup by sdselect Vol.* from dbo.Vol inner join #temp on #temp.sd=Vol.sd and #temp.ts=Vol.tsinner join Vol_type on Vol_type.Rank=#temp.Rankand Vol_type.tp=Vol.tpdrop table #tempOr if you are using SQL server 2005 or later, then use this query:WITH temp AS( select Vol.sd, Vol.q, Vol.ts, Vol.tp, ROW_NUMBER() OVER (PARTITION BY SD ORDER BY Q, Vol.ts DESC, Vol_type.[Rank] desc) AS RowID from Vol inner join Vol_type on Vol.tp = Vol_type.tp)select sd, q, ts, tp from temp where RowID = 1SQL Server Programmers and Consultantshttp://www.sql-programmers.com/ |
 |
|
|
|
|
|