PDA

View Full Version : واکشی داده ها بر حسب درصد



bftarane
شنبه 25 مرداد 1393, 23:08 عصر
سلام.
فرض کنید یک جدول داریم که در اون آگهی های کاربران رو ذخیره می کنیم و آگهی ها می تونن 7 ستاره و 6 ستاره و 5 ستاره الی .... 0 ستاره باشن.
حالا اگه شانس نمایش آگهی ها در صفحه اول رو بر حسب ستاره در نظر بگیریم
مثلاً 7 ستاره 100 %
6 ستاره 84 %
5 ستاره 72 % و الی آخر
آیا میشه توسط دستورات sql این داده ها رو واکشی کرد؟

یکی از دوستان راهنمایی کردن که از طریق مثلاً select top 50 percent میشه 50 درصد داده های یک جدول رو واکشی کرد ولی اینجا قضیه فرق داره و داده ها بر اساس ستاره باید بهشون درصد داده بشه.
ممنون

plus
یک شنبه 26 مرداد 1393, 00:51 صبح
خوب شما میتونید مقادیر هر درصد رو با SELECT جداگانه بدست بیارین و با چندتا UNION نتیجه مورد نظر رو بدست بیارین:

SELECT TOP 100 PERCENT * FROM MYTABLE WHERE STAR = 7 ORDER BY NEWID()
UNION
SELECT TOP 84 PERCENT * FROM MYTABLE WHERE STAR = 6 ORDER BY NEWID()
UNION
SELECT TOP 72 PERCENT * FROM MYTABLE WHERE STAR = 5 ORDER BY NEWID()


البته مطمئن نیستم روش بهینه باشه، اولین روشیه که به ذهنم رسید.
در ضمن استفاده از ORDER BY NEWID برای اینه که رکورد ها به صورت RANDOM انتخاب بشن.

bftarane
یک شنبه 26 مرداد 1393, 10:22 صبح
از نظر بهینه بودن در این لینک http://programmer.persianblog.ir/post/42/
خوندم که فشار زیادی به سرور وارد میشه، ولی فکر کنم چاره دیگه ای نباشه.
من با اکسس کار میکنم و سر کار sql server نداشتم تست کنم. در اکسس اون ORDER BY NEWID کار نمی کنه من قبلاً از این استفاده کرده بودم برای Random بودن

ORDER BY Rnd(-(1000*ID)*Time())
که نمی دونم چرا اینجا جواب نمی ده (که البته چون اینجا تالار Access نیست از طرق دیگه دنبال جواب این خواهم بود) ولی کلیت قضیه که واکشی بر حسب درصدها بود رو تا جایی که تست کردم کار میکنه.
در کل فعلاً دستورات به شکل زیر شدن که فقط اون قضیه Random کار نمی کنه.
(SELECT TOP 100 PERCENT * FROM tbl WHERE Stars = 7 ORDER BY Rnd(-(1000*adID)*Time())) UNION (SELECT TOP 84 PERCENT * FROM tbl WHERE Stars = 6 ORDER BY Rnd(-(1000*adID)*Time())) UNION (SELECT TOP 72 PERCENT * FROM tbl WHERE Stars = 5 ORDER BY Rnd(-(1000*adID)*Time()))
خیلی ممنون.