Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
elvinny
Starting Member
1 Post |
Posted - 2010-09-29 : 11:43:09
|
HiI need help in doing a query: I have 3 tables, one with a channelID and a groupID (table1), another with a AssetID and a groupID(table2) and for last other with AssetID and OfferID. I need a select which chooses 8 offerIDs, ramdomly for each channelID. If i have 120 channels i need 120*8 offer ids, or 8 offers per channel. I used the next sql query but the result is not right. SELECT table1.CHANNEL_ID ,table3.OFFER_IDFROM [RECOM_VOD].[CHANNELS_VS_ASSET_GROUP] as table1INNER JOIN [RECOM_VOD].[ASSETS_VS_ASSET_GROUP] as table2ON table2.ASSET_GROUP_ID = table1.ASSET_GROUP_IDJOIN [RECOM_VOD].[ASSETS] as table3ON table3.ID_ASSETS = table2.ASSET_IDWHERE table2.ASSET_ID IN ( SELECT top 8tableA.ID_ASSETSFROM .[RECOM_VOD].[ASSETS] as tableA WHERE OFFER_ID is not NULL order by NEWID())GROUP BY table3.OFFER_ID,table1.CHANNEL_IDORDER BY table1.CHANNEL_ID Regards Luis |
|
|
jleitao
Posting Yak Master
100 Posts |
Posted - 2010-09-29 : 18:46:25
|
| hi elvinny,First at all, sorry my english :( I hope my SQL be a bit better.Right now i dont have way to test and see performace of the next query. However tomorrow i can test it if you have any problem.The query return a result set for each channel_id you have. If you need all in the same result set you can "replace" the select commad by a insert command to a new table and then you can make a simple select. If you cant create a new table probably someone else will have a great and better ideia (we hope) :D DECLARE@AUX_ROW_NUMBER AS INT,@AUX_MAX_ROW_NUMBER AS INT--ENUMERATE ALL CHANNEL_ID AND GIVES A ROW NUMBER--IF CHANNEL_ID IS NOT UNIQUE YOU NEED ADD A DISTINCT IN THE NEXT QUERYSELECT @AUX_MAX_ROW_NUMBER = MAX(ROWNUMBER) FROM ( SELECT ROW_NUMBER() OVER(ORDER BY CHANNEL_ID) AS ROWNUMBER FROM TABLE1) ASET @AUX_ROW_NUMBER = 1--EXECUTE THE QUERY (TOP 8) FOR EACH CHANNEL_ID YOU HAVEWHILE @AUX_ROW_NUMBER =< @AUX_MAX_ROW_NUMBERBEGIN-- SELECT TOP 8 C.ID_ASSETS AUXB.CHANNEL_ID FROM TABLE3 C INNER JOIN ( SELECT B.ASSETID, AAUX.CHANNEL_ID FROM TABLE2 B INNER JOIN ( SELECT * FROM( --IF CHANNEL_ID IS NOT UNIQUE YOU NEED ADD A DISTINCT IN THE NEXT QUERY SELECT ROW_NUMBER() OVER(ORDER BY CHANNEL_ID) AS ROWNUMBER, CHANNEL_ID, GROUPID FROM TABLE1 A )A1 WHERE ROWNUMBER = @AUX_ROW_NUMBER )AAUX ON B.GROUPID = AAUX.GROUPID ) AUXB ON C.ASSETID = AUXB.ASSETID WHERE OFFER_ID IS NOT NULL ORDER BY NEWID()-- SET @AUX_ROW_NUMBER = @AUX_ROW_NUMBER + 1END |
 |
|
|
|
|
|
|
|