PDA

View Full Version : سوال: انتخاب تصادفی رکوردها در SQL با رعایت اولویت Random Record with Priority



FirstLine
سه شنبه 18 تیر 1387, 10:52 صبح
با سلام
یه جدول شامل سه رکورد دارم:
id , text , priority
ID=AutoNumber & Key
priority یه فیلد عددی بین 1 تا 10 است
نیاز به یه کوئری دارم که بصورت تصادفی 5 عدد از رکوردهای این جدول را نمایش بدهد بصورتیکه id آن تکراری نباشد و احتمال نمایش هر رکورد بر اساس مقدار فیلد priority باشد یعنی مثلا رکوردی که priority آن برابر با 6 است 2 برابر رکوردی باشد که priority برابر با 3 است و یا رکوردی که priority آن برابر با 10 است 10 برابر رکوردی که priority برابر با 1 است باشد.
از کوئری زیر میشه استفاده کرد ولی نمیشه اولویت براش تعریف کرد


Sql Query = SELECT Top 5 * FROM tbl_Text Order by NewID()

با تشکر

FirstLine
پنج شنبه 20 تیر 1387, 10:55 صبح
با سلام
آیا راهی وجود ندارد؟
با تشکر

رضا عربلو
پنج شنبه 20 تیر 1387, 13:06 عصر
ابتدا بایستی priority را در جدولت اعمال کنی و از آن یک جدول جدید استخراج کنی، یکی از ساده ترین روش ها این است که رکوردی که دارای prioprity برابر 2 می باشد در جدول نتیجه 2 بار تکرار شود و ...و بعد بر روی جدول فوق select بزنی و برای اینکه 5 نتیجه غیر تکراری بدهد Group By کنی.

البته از نظر قوانین احتمال هیچ وقت غیر ممکن نیست که 1000 بار تاس بیندازی و هر دفعه 6 بیاید. بنابر این نمی توان تضمین کرد که رکوردی که priority آن برابر با 6 است 2 برابر رکوردی باشد که priority برابر با 3 است و یا رکوردی که priority آن برابر با 10 است 10 برابر رکوردی که priority برابر با 1 است باشد

FirstLine
شنبه 22 تیر 1387, 02:05 صبح
با سلام
یعنی یه جدول مجازی درست کنم و از داخل اوون یه کوئری جدید بزنم؟
لطفا بشتر راهنمایی بفرمایید.
با تشکر

رضا عربلو
شنبه 22 تیر 1387, 17:48 عصر
احتیاجی نیست که یک جدول مجازی بسازی می توانی با یک کوئری نیز به آن برسی.
شاید یکی از ساده ترین روش ها این است که یک جدول به نام Priority با دو ستون ID از نوع autoIncrement و prty از نوع INT بسازی که در آن پریوریتی 1 یکبار و پریوریتی 2 دو بار و ... تکرار شده باشد. یعیی:
1------------1
2------------2
2------------3
3------------4
3------------5
3------------6
حالا اون را در یک ویو و یا کوئری با جدول tbl_Text جوین کن به نحوی که دو تا فیلد پریوریتی ات به هم جوین شوند. یه همچین چیزی :


SELECT dbo.tbl_Text.Id, ...
FROM dbo.tbl_Text INNER JOIN
dbo.Priority ON dbo.Priority.Prty = dbo.tbl_Text.Priority