এসকিউএল সার্ভার টেবিল থেকে এন এলোমেলো সারি নির্বাচন করুন


309

আমি এতে প্রায় 50,000 সারি সহ একটি এসকিউএল সার্ভার টেবিল পেয়েছি। আমি এলোমেলোভাবে এই সারির প্রায় 5,000 টি নির্বাচন করতে চাই। আমি একটি জটিল উপায়ে ভেবেছি, একটি "এলোমেলো সংখ্যা" কলাম দিয়ে একটি টেম্প টেবিল তৈরি করেছি, আমার টেবিলটি এতে অনুলিপি করছি, টেম্প টেবিলটি লুপ করে এবং প্রতিটি সারিটি আপডেট করে RAND()এবং তারপরে সেই টেবিলটি থেকে নির্বাচন করে যেখানে এলোমেলো নম্বর কলাম < 0.1। আমি এটি করার একটি সহজ উপায় সন্ধান করছি, যদি সম্ভব হয় তবে একক বিবৃতিতে।

এই নিবন্ধটিNEWID() ফাংশনটি ব্যবহার করার পরামর্শ দেয়। এটি আশাব্যঞ্জক দেখাচ্ছে তবে আমি দেখতে পাচ্ছি না কীভাবে আমি সুনির্দিষ্টভাবে একটি নির্দিষ্ট শতাংশ নির্বাচন করতে পারি।

এর আগে কেউ কি কখনও করে? কোন ধারনা?


3
এমএসডিএন এর একটি ভাল নিবন্ধ রয়েছে যা এই বিষয়গুলির অনেকগুলি জুড়ে: একটি বড় টেবিল থেকে এলোমেলোভাবে সারি নির্বাচন করা
কাইলমিট

উত্তর:


387
select top 10 percent * from [yourtable] order by newid()

বড় টেবিলগুলি সম্পর্কে "খাঁটি ট্র্যাশ" মন্তব্যের প্রতিক্রিয়া: আপনি পারফরম্যান্সের উন্নতি করতে এটি এটি করতে পারেন।

select  * from [yourtable] where [yourPk] in 
(select top 10 percent [yourPk] from [yourtable] order by newid())

এর ব্যয় হবে মূল্যের মূল স্ক্যান প্লাস যোগ মূল্যের, যা একটি ছোট টেবিলে একটি ছোট শতাংশ নির্বাচন যুক্তিসঙ্গত হওয়া উচিত।


1
তিনি উল্লেখ করেছেন নিবন্ধটি ব্যবহার করে তারপরে আমার এই পদ্ধতিরটি অনেক ভাল।
জোশবার্ক

14
সর্বদা এটি মনে রাখা ভাল যে newid () আসলে খুব ভাল সিউডোরেন্ডম নম্বর জেনারেটর নয়, কমপক্ষে র্যান্ড () এর মতো প্রায় ভাল নয়। তবে আপনার যদি কেবল কিছু অস্পষ্টভাবে এলোমেলো নমুনার প্রয়োজন হয় এবং গাণিতিক গুণাবলী এবং এগুলি সম্পর্কে যত্নশীল না হন তবে এটি যথেষ্ট ভাল। অন্যথায় আপনি প্রয়োজন: stackoverflow.com/questions/249301/...
user12861

1
ওম, দুঃখিত যদি এটি সুস্পষ্ট হয় .. তবে কী [yourPk]বোঝায়? সম্পাদনা: এনভিএম, এটি আবিষ্কার করেছেন ... প্রাথমিক কী। দুরর
স্নাইলার

4
newid - গাইডটি অনন্য হতে পারে তবে এলোমেলো নয় .. ভুল পদ্ধতির
Brans Ds

2
সারি সংখ্যক সারি সহ উদাহরণস্বরূপ 1 মিলিয়নেরও বেশি newid()বাছাই করা প্রাক্কলন I / O খরচ খুব বেশি হবে এবং কার্য সম্পাদনকে প্রভাবিত করবে।
aadi1295

81

আপনার প্রয়োজনের উপর নির্ভর করে TABLESAMPLEআপনাকে প্রায় এলোমেলো এবং আরও ভাল পারফরম্যান্স পাবেন। এটি এমএস এসকিউএল সার্ভার ২০০৫ এবং তার পরে পাওয়া যায়।

TABLESAMPLE এলোমেলো সারিগুলির পরিবর্তে এলোমেলো পৃষ্ঠাগুলি থেকে ডেটা ফেরত দেবে এবং অতএব ডিওগুলি এমন ডেটা পুনরুদ্ধারও করবে না যে এটি ফিরে আসবে না।

খুব বড় টেবিলে আমি পরীক্ষা করেছি

select top 1 percent * from [tablename] order by newid()

20 মিনিটেরও বেশি সময় নিয়েছে।

select * from [tablename] tablesample(1 percent)

2 মিনিট সময় নিয়েছে।

ক্ষুদ্রতর নমুনাগুলির সাথে পারফরম্যান্সও উন্নত হবে TABLESAMPLEযেখানে এটি হবে না newid()

দয়া করে মনে রাখবেন যে এটি newid()পদ্ধতির মতো এলোমেলো নয় তবে আপনাকে একটি শালীন নমুনা দেবে।

দেখুন দুটিই MSDN পৃষ্ঠা


7
রব বোকের নীচে যেমন উল্লেখ করা হয়েছে, টেবিল স্যাম্পলিংয়ের ফলাফলগুলি ছড়িয়ে পড়ে এবং অতএব অল্প সংখ্যক এলোমেলো ফলাফল পাওয়ার পক্ষে ভাল উপায় নয়
ওসকর অস্টেগার্ড

এটি কীভাবে কাজ করে তা আপনার মনে মনে প্রশ্ন রয়েছে: newid () দ্বারা [টেবিলের নাম] ক্রমানুসারে শীর্ষ 1 শতাংশ * নির্বাচন করুন যেহেতু newid () [টেবিলের নাম] এ কোনও কলাম নয়। এসকিএল সার্ভারটি কি প্রতিটি সারিতে অভ্যন্তরীণ কলামে নতুন ()) যুক্ত করে একটি বাছাই করে?
ফ্রেনকিবি

আমি খুব বড় টেবিলে একটি জটিল কোয়েরি করছিলাম বলে সারণী নমুনাটি আমার পক্ষে সেরা উত্তর ছিল। কোনও সন্দেহ নেই যে এটি উল্লেখযোগ্যভাবে দ্রুত ছিল। আমি এই একাধিকবার দৌড়ানোর সাথে সাথে সংখ্যার রেকর্ডে ফিরে আসার পরিবর্তিততা পেয়েছি তবে সেগুলি সমস্ত ত্রুটির একটি গ্রহণযোগ্য ব্যবস্থার মধ্যে ছিল।
jessier3

38

newid () / অর্ডার বাই কাজ করবে তবে বড় রেজাল্ট সেটের জন্য খুব ব্যয়বহুল হবে কারণ এটি প্রতিটি সারির জন্য একটি আইডি উত্পন্ন করতে হবে এবং তারপরে সেগুলি বাছাই করতে হবে।

টেবিলস্যাম্পল () পারফরম্যান্সের দিক থেকে ভাল তবে আপনি ফলাফলের ক্লাম্পিং পাবেন (একটি পৃষ্ঠায় সমস্ত সারি ফিরে আসবে)।

সত্যিকারের এলোমেলো নমুনার আরও ভাল পারফরম্যান্সের জন্য, এলোমেলোভাবে সারিগুলি ফিল্টার করা সবচেয়ে ভাল উপায়। আমি এসকিউএল সার্ভার বই অনলাইন নিবন্ধে সারণি নমুনা ব্যবহার করে ফলাফলের সীমাবদ্ধকরণগুলিতে নিম্নলিখিত কোডের নমুনা পেয়েছি :

আপনি যদি সত্যিই পৃথক সারিগুলির একটি এলোমেলো নমুনা চান তবে সারণীটি স্যাম্বল ব্যবহার না করে এলোমেলোভাবে সারিগুলি ফিল্টার করার জন্য আপনার ক্যোয়ারীটি পরিবর্তন করুন। উদাহরণস্বরূপ, নিম্নলিখিত কোয়েরি বিক্রয়ের সারিগুলির প্রায় এক শতাংশ ফেরত দিতে NEWID ফাংশনটি ব্যবহার করে a সেলস অর্ডারডেটেল টেবিল:

SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(),SalesOrderID) & 0x7fffffff AS float)
              / CAST (0x7fffffff AS int)

সেলসঅর্ডারআইডি কলামটি চেকসুম এক্সপ্রেশনটিতে অন্তর্ভুক্ত করা হয়েছে যাতে NEWID () প্রতি সারি ভিত্তিতে নমুনা অর্জনের জন্য প্রতি সারিতে একবার মূল্যায়ন করে। CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff as float / CAST (0x7fffffff AS int) এক্সপ্রেশনটি 0 এবং 1 এর মধ্যে একটি এলোমেলো ফ্লোট মানকে মূল্যায়ন করে।

যখন 1,000,000 সারি দিয়ে কোনও টেবিলের বিরুদ্ধে চালানো হয়, তখন আমার ফলাফলগুলি এখানে রয়েছে:

SET STATISTICS TIME ON
SET STATISTICS IO ON

/* newid()
   rows returned: 10000
   logical reads: 3359
   CPU time: 3312 ms
   elapsed time = 3359 ms
*/
SELECT TOP 1 PERCENT Number
FROM Numbers
ORDER BY newid()

/* TABLESAMPLE
   rows returned: 9269 (varies)
   logical reads: 32
   CPU time: 0 ms
   elapsed time: 5 ms
*/
SELECT Number
FROM Numbers
TABLESAMPLE (1 PERCENT)

/* Filter
   rows returned: 9994 (varies)
   logical reads: 3359
   CPU time: 641 ms
   elapsed time: 627 ms
*/    
SELECT Number
FROM Numbers
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), Number) & 0x7fffffff AS float) 
              / CAST (0x7fffffff AS int)

SET STATISTICS IO OFF
SET STATISTICS TIME OFF

আপনি যদি টেবিলস্যাম্পল ব্যবহার করে পালাতে পারেন তবে এটি আপনাকে সেরা পারফরম্যান্স দেবে। অন্যথায় newid () / ফিল্টার পদ্ধতিটি ব্যবহার করুন। newid () / অর্ডার দ্বারা সর্বশেষ অবলম্বন হওয়া উচিত যদি আপনার একটি বড় ফলাফল সেট থাকে।


আমি সেই নিবন্ধটিও দেখেছি এবং আমার কোডটিতে চেষ্টা করে দেখেছি, মনে হয় যে NewID()প্রতি সারির পরিবর্তে কেবল একবারেই মূল্যায়ন করা হয়েছে, যা আমি পছন্দ করি না ...
অ্যান্ড্রু মাও

23

এমএসডিএন-তে একটি বৃহত টেবিল থেকে এলোমেলোভাবে সারি নির্বাচন করা একটি সহজ, ভাল-উচ্চারণযুক্ত সমাধান রয়েছে যা বৃহত আকারের কর্মক্ষমতা সম্পর্কিত উদ্বেগগুলিকে সম্বোধন করে।

  SELECT * FROM Table1
  WHERE (ABS(CAST(
  (BINARY_CHECKSUM(*) *
  RAND()) as int)) % 100) < 10

খুব আকর্ষণীয়. নিবন্ধটি পড়ার পরে, আমি সত্যিই বুঝতে পারি না কেন RAND()প্রতিটি সারির জন্য একই মান ফেরত দেয় না (যা BINARY_CHECKSUM()যুক্তিকে পরাস্ত করবে )। এটি কি সেফেক্ট ক্লজের অংশ হওয়ার চেয়ে অন্য ফাংশনের ভিতরে ডাকা হচ্ছে বলে?
জন এম গ্যান্ট

এই কোয়েরিটি এক সেকেন্ডেরও কম সময়ে 6 মিমি সারি সহ একটি টেবিলের উপরে চলেছিল।
মার্ক মেলভিলে

2
আমি এই জিজ্ঞাসাটি 35 টি এন্ট্রি সহ একটি টেবিলটিতে চালিয়েছি এবং ফলাফল সেটে খুব দু'বার রেখে চলেছি often এটি সমস্যাটি হতে পারে rand()বা উপরের সংমিশ্রণ হতে পারে - তবে আমি এই কারণে এই সমাধান থেকে সরে এসেছি। এছাড়াও ফলাফলের সংখ্যা 1 থেকে 5 এর মধ্যে পরিবর্তিত হয়েছিল যাতে এটি কিছু পরিস্থিতিতে গ্রহণযোগ্য নাও হতে পারে।
অলিভার

RAND () প্রতিটি সারির জন্য একই মান ফেরত দেয় না?
সরসপরিলা

RAND()প্রতিটি সারির জন্য একই মান প্রদান করে (যার কারণে এই সমাধানটি দ্রুত)। তবে, বাইনারি চেকসাম সহ সারিগুলি যেগুলি খুব কাছাকাছি রয়েছে তারা একই ধরণের চেকসাম ফলাফল উত্পন্ন করার ঝুঁকিপূর্ণ এবং RAND()ছোট যখন ক্লাম্পিংয়ের কারণ হয়। যেমন, (ABS(CAST((BINARY_CHECKSUM(111,null,null) * 0.1) as int))) % 100== SELECT (ABS(CAST((BINARY_CHECKSUM(113,null,null) * 0.1) as int))) % 100। আপনার ডেটা যদি এই সমস্যায় ভুগছে তবে BINARY_CHECKSUM9923 দিয়ে গুণ করুন
ব্রায়ান

12

এই লিঙ্কটির অর্ডারবাই (নিউআইডি ()) এবং 1, 7 এবং 13 মিলিয়ন সারির টেবিলগুলির জন্য অন্যান্য পদ্ধতির মধ্যে একটি আকর্ষণীয় তুলনা রয়েছে।

প্রায়শই, যখন আলোচনা গোষ্ঠীতে এলোমেলো সারিগুলি নির্বাচন করতে হয় এমন প্রশ্ন জিজ্ঞাসা করা হয়, NEWID কোয়েরি প্রস্তাবিত হয়; এটি সহজ এবং ছোট টেবিলগুলির জন্য খুব ভাল কাজ করে।

SELECT TOP 10 PERCENT *
  FROM Table1
  ORDER BY NEWID()

তবে আপনি যখন বৃহত টেবিলগুলির জন্য এটি ব্যবহার করেন তখন NEWID ক্যোয়ারিতে একটি বড় ত্রুটি রয়েছে। অর্ডার বাই ক্লজটি টেবিলের সমস্ত সারিগুলিকে টেম্পডিবি ডাটাবেসে অনুলিপি দেয়, যেখানে সেগুলি সাজানো হয়। এটি দুটি সমস্যার কারণ:

  1. বাছাইয়ের ক্রিয়াকলাপটি সাধারণত এর সাথে বেশি দামের সাথে যুক্ত থাকে। বাছাই অনেকগুলি ডিস্ক আই / ও ব্যবহার করতে পারে এবং দীর্ঘ সময় ধরে চলতে পারে।
  2. সবচেয়ে খারাপ পরিস্থিতিতে, টেম্পডিবি স্থানের বাইরে চলে যেতে পারে। সর্বাধিক ক্ষেত্রে দৃশ্যে, টেম্প্যাডবিবি প্রচুর পরিমাণে ডিস্ক স্পেস নিতে পারে যা ম্যানুয়াল সঙ্কুচিত কমান্ড ব্যতীত আর পুনরুদ্ধার করা যায় না।

আপনার যা প্রয়োজন তা হল এলোমেলোভাবে সারিগুলি নির্বাচন করার একটি উপায় যা টেম্পিডবি ব্যবহার করবে না এবং টেবিলটি বড় হওয়ার সাথে সাথে খুব ধীর পাবে না। এটি কীভাবে করা যায় সে সম্পর্কে এখানে একটি নতুন ধারণা দেওয়া হয়েছে:

SELECT * FROM Table1
  WHERE (ABS(CAST(
  (BINARY_CHECKSUM(*) *
  RAND()) as int)) % 100) < 10

এই ক্যোয়ারির পিছনে মূল ধারণাটি হ'ল আমরা সারণীতে প্রতিটি সারির জন্য 0 এবং 99 এর মধ্যে একটি এলোমেলো সংখ্যা তৈরি করতে চাই এবং তারপরে সেই সমস্ত সারিগুলি বেছে নেব যাদের র্যান্ডম সংখ্যা নির্দিষ্ট শতাংশের মানের চেয়ে কম less এই উদাহরণে, আমরা এলোমেলোভাবে নির্বাচিত সারিগুলির প্রায় 10 শতাংশ চাই; অতএব, আমরা সমস্ত সারি নির্বাচন করি যার এলোমেলো সংখ্যা 10 এর চেয়ে কম is

এমএসডিএন-তে সম্পূর্ণ নিবন্ধটি পড়ুন ।


2
হাই ডিম্বার, ভাল পাওয়া গেছে, আপনি সম্ভবত এটির সমাধান করতে পারেন কারণ কেবলমাত্র উত্তর লিঙ্ক মুছে ফেলা হতে পারে।
বম্মি

1
কেবলমাত্র উত্তরটি লিঙ্ক হওয়া এড়াতে আমি অাবম্মি এটিকে পরিবর্তন করেছি :)
কিউ মাস্টার

এটি সেরা উত্তর। 'অর্ডার বাই নিউড ()' বেশিরভাগ ক্ষেত্রে (ছোট টেবিলগুলি) কাজ করে তবে পুনরায় সংযুক্ত লিঙ্কের মানদণ্ডগুলি স্পষ্টভাবে দেখায় যে টেবিলটি
বাড়ার সাথে সাথে

10

আপনার যদি (ওপি থেকে পৃথক নয়) একটি নির্দিষ্ট সংখ্যক রেকর্ডের প্রয়োজন হয় (যা চেকসুমের পদ্ধতিকে কঠিন করে তোলে) এবং টেবিলসাম্পল নিজেই সরবরাহ করে তার চেয়েও বেশি এলোমেলো নমুনার চান, এবং চেকসামের চেয়ে আরও ভাল গতি চান, তবে আপনি একটি সংযোজন করে করতে পারেন টেবিলসাম্পল এবং নিউআইডি () পদ্ধতিগুলি:

DECLARE @sampleCount int = 50
SET STATISTICS TIME ON

SELECT TOP (@sampleCount) * 
FROM [yourtable] TABLESAMPLE(10 PERCENT)
ORDER BY NEWID()

SET STATISTICS TIME OFF

আমার ক্ষেত্রে এটি এলোমেলোতা (এটি আসলে নয়, আমি জানি) এবং গতির মধ্যে সবচেয়ে সরল সমঝোতা। টেবলস্যাম্পল শতাংশ (বা সারিগুলি) যথাযথ হিসাবে বিভিন্ন করুন - শতাংশ যত বেশি, নমুনাটি তত বেশি এলোমেলো, তবে গতিতে রৈখিক এক ড্রপ ছাড়ার প্রত্যাশা করুন। (দ্রষ্টব্য যে টেবিলস্যাম্পল কোনও পরিবর্তনশীল গ্রহণ করবে না)


9

কেবল একটি এলোমেলো সংখ্যায় টেবিলটি অর্ডার করুন এবং ব্যবহার করে প্রথম 5000 সারিটি পান TOP

SELECT TOP 5000 * FROM [Table] ORDER BY newid();

হালনাগাদ

কেবল এটি চেষ্টা করে দেখুন একটি newid()কলই যথেষ্ট - সমস্ত ক্যাসেট এবং সমস্ত গণিতের প্রয়োজন নেই।


10
'সমস্ত ক্যাসেট এবং সমস্ত গণিত' ব্যবহার করার কারণটি আরও ভাল পারফরম্যান্সের জন্য।
hkf

6

এটি প্রাথমিক বীজ ধারণা এবং একটি চেকসামের সংমিশ্রণ যা আমাকে NEWID () ব্যয় ছাড়াই সঠিকভাবে এলোমেলো ফলাফল দেওয়ার জন্য দেখায়:

SELECT TOP [number] 
FROM table_name
ORDER BY RAND(CHECKSUM(*) * RAND())

3

মাইএসকিউএল এ আপনি এটি করতে পারেন:

SELECT `PRIMARY_KEY`, rand() FROM table ORDER BY rand() LIMIT 5000;

3
এটি কাজ করবে না। যেহেতু নির্বাচিত বিবৃতিটি পারমাণবিক, এটি কেবল একটি এলোমেলো সংখ্যা ধরে এবং প্রতিটি সারির জন্য এটি সদৃশ করে। এটিকে পরিবর্তন করতে বাধ্য করার জন্য আপনাকে এটিকে প্রতিটি সারিতে পুনর্নির্মাণ করতে হবে।
টম এইচ

4
মিম ... প্রেমের বিক্রেতার পার্থক্য। নির্বাচনটি মাইএসকিউএল-তে পারমাণবিক, তবে আমি মনে করি অন্যভাবে। এটি মাইএসকিউএলে কাজ করবে।
জেফ ফেরল্যান্ড

2

উত্তরের ক্ষেত্রে এই প্রকরণটি বেশিরভাগভাবে দেখেনি। প্রতিবার একই সারির একই সেট নির্বাচন করতে আমার প্রাথমিক বাধা দেওয়াতে আমার অতিরিক্ত বাধা ছিল।

এমএস এসকিউএল এর জন্য:

সর্বনিম্ন উদাহরণ:

select top 10 percent *
from table_name
order by rand(checksum(*))

কার্যকর কার্যকর সময়: 1.00

NewId () উদাহরণ:

select top 10 percent *
from table_name
order by newid()

কার্যকর কার্যকর সময়: 1.02

NewId() তুলনায় তুচ্ছ ধীর rand(checksum(*)) , তাই আপনি এটি বড় রেকর্ড সেটগুলির বিরুদ্ধে ব্যবহার করতে নাও চান।

প্রাথমিক বীজ সহ নির্বাচন:

declare @seed int
set @seed = Year(getdate()) * month(getdate()) /* any other initial seed here */

select top 10 percent *
from table_name
order by rand(checksum(*) % @seed) /* any other math function here */

আপনার যদি বীজ দেওয়া একই সেটটি নির্বাচন করতে হয় তবে এটি কাজ করে বলে মনে হচ্ছে।


RAND () এর বিপরীতে বিশেষ @ বীজ ব্যবহারের কোনও সুবিধা আছে কি?
কিউমাস্টার

একেবারে, আপনি বীজ প্যারামিটার ব্যবহার করেছেন এবং তারিখের প্যারামিটার দ্বারা এটি পূরণ করুন, RAND () ফাংশনটি সম্পূর্ণ সময়ের মানটি ব্যতীত একই কাজ করে, আমি জানতে চাই যে র্যান্ডের উপরে বীজের মতো হ্যান্ডে তৈরি প্যারামিটার ব্যবহার করার কোনও সুবিধা আছে কি না)?
কিউমাস্টার

আহ !. ঠিক আছে, এটি প্রকল্পের প্রয়োজন ছিল। আমার একটি নির্ধারিত পদ্ধতিতে এন-এলোমেলো সারিগুলির একটি তালিকা তৈরি করা দরকার। মূলত নেতৃত্ব জানতে চেয়েছিল যে সারিগুলি নির্বাচন করা এবং প্রক্রিয়া করার কিছু দিন আগে আমরা "এলোমেলো" সারিগুলি কী নির্বাচন করব। বছর / মাসের উপর ভিত্তি করে একটি বীজ মান তৈরি করে আমি সেই বছরের যে কোনও কলটিতে গ্যারান্টি দিতে পারি যে একই বছর "এলোমেলো" তালিকাটি ফিরে আসবে। আমি জানি, এটি অদ্ভুত ছিল এবং সম্ভবত আরও ভাল উপায় ছিল তবে এটি কাজ করেছিল ...
ক্লিড

হাহা :) আমি দেখতে পেয়েছি, তবে আমি মনে করি এলোমেলোভাবে নির্বাচিত রেকর্ডগুলির সাধারণ অর্থ বিভিন্ন চলমান ক্যোয়ারিতে একই রেকর্ড নয়।
কিউমাস্টার


0

এটি নতুনভাবে উপস্থিত হয় () যেখানে ধারাটিতে ব্যবহার করা যাবে না, সুতরাং এই সমাধানটির জন্য একটি অভ্যন্তরীণ কোয়েরি প্রয়োজন:

SELECT *
FROM (
    SELECT *, ABS(CHECKSUM(NEWID())) AS Rnd
    FROM MyTable
) vw
WHERE Rnd % 100 < 10        --10%

0

আমি এটি সাবকিউরিতে ব্যবহার করছিলাম এবং এটি আমাকে সাবকিউরিতে একই সারিগুলি ফিরিয়ে দিয়েছে

 SELECT  ID ,
            ( SELECT TOP 1
                        ImageURL
              FROM      SubTable 
              ORDER BY  NEWID()
            ) AS ImageURL,
            GETUTCDATE() ,
            1
    FROM    Mytable

তারপরে আমি কোথায় প্যারেন্ট টেবিল ভেরিয়েবল সহ সমাধান করেছি

SELECT  ID ,
            ( SELECT TOP 1
                        ImageURL
              FROM      SubTable 
              Where Mytable.ID>0
              ORDER BY  NEWID()
            ) AS ImageURL,
            GETUTCDATE() ,
            1
    FROM    Mytable

সংক্ষেপণ যেখানে নোট করুন


0

ব্যবহারে থাকা সার্ভার-সাইড প্রসেসিংয়ের ভাষা (যেমন পিএইচপি,। নেট, ইত্যাদি) নির্দিষ্ট করা হয়নি, তবে এটি পিএইচপি হলে প্রয়োজনীয় নম্বরটি (বা সমস্ত রেকর্ড) ধরুন এবং কোয়েরিতে র্যান্ডমাইজিংয়ের পরিবর্তে পিএইচপি-র শফল ফাংশনটি ব্যবহার করুন। আমি জানি না। নেট এর সমতুল্য ফাংশন আছে কিনা তবে যদি তা হয় তবে আপনি। নেট ব্যবহার করছেন তবে এটি ব্যবহার করুন

কতগুলি রেকর্ড জড়িত তার উপর নির্ভর করে র‌্যান্ডের অর্ডার () -এর পক্ষে একটি পারফরম্যান্স পেনাল্টি থাকতে পারে।


আমি এই সময়টির জন্য ঠিক কী ব্যবহার করছিলাম তা মনে নেই, তবে আমি সম্ভবত সি # তে কাজ করছিলাম, সম্ভবত কোনও সার্ভারে, অথবা ক্লায়েন্ট অ্যাপ্লিকেশনটিতে, নিশ্চিত ছিল না। সি # এর পিএইচপি-র এলোমেলো আফিকের সাথে সরাসরি তুলনা করার মতো কিছু নেই, তবে এটি একটি সিলেক্ট অপারেশনের মধ্যে র্যান্ডম অবজেক্ট থেকে ফাংশন প্রয়োগ করে ফলাফল অর্ডার করে এবং তারপরে শীর্ষ দশ শতাংশ গ্রহণের মাধ্যমে করা যেতে পারে। তবে আমাদের কেবল ডিবি সার্ভারের ডিস্ক থেকে পুরো টেবিলটি পড়তে হবে এবং এটি নেটওয়ার্কের মধ্যে প্রেরণ করতে হবে, কেবলমাত্র সেই 90% ডেটা ফেলে দিতে। সরাসরি ডিবিতে এটি প্রক্রিয়াজাতকরণ অবশ্যই আরও কার্যকর।
জন এম গ্যান্ট

-2

এটি আমার পক্ষে কাজ করে:

SELECT * FROM table_name
ORDER BY RANDOM()
LIMIT [number]

9
@ user537824, আপনি কি এটি এসকিউএল সার্ভারে চেষ্টা করেছিলেন? র‌্যান্ডম কোনও ফাংশন নয় এবং লিমিট কোনও কীওয়ার্ড নয়। আপনি যা করছেন তার জন্য এসকিউএল সার্ভার সিনট্যাক্সটি হবে select top 10 percent from table_name order by rand()তবে এটিও কাজ করে না কারণ র্যান্ড () সমস্ত সারিতে একই মান দেয়।
জন এম গ্যান্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.