এসকিউএল এ এলোমেলোভাবে সারিগুলি কীভাবে নির্বাচন করবেন?


226

আমি এমএসএসকিউএল সার্ভার ২০০৫ ব্যবহার করছি d 1,000 ফলাফল।

আমি একটি কার্যকারিতা তৈরি করছি যেখানে প্রতিবার এলোমেলোভাবে আমাকে 5 জন গ্রাহক বাছাই করতে হবে। কেউ কি আমাকে জিজ্ঞাসা করতে হবে যে কীভাবে একটি ক্যোয়ারী তৈরি করতে হবে যা জিজ্ঞাসা কার্যকর করার সময় প্রতিবার এলোমেলোভাবে 5 টি সারি (আইডি এবং নাম) পাবে?


কোনও ডাটাবেসের জন্য র্যান্ডম কোনও সাধারণ প্রয়োজন নয়, আমি কিছু এসকিউএল
হয়েছি

2
আপনি কতটা এলোমেলো চান তার উপর নির্ভর করে। দেখুন: এমএসডিএন.মাইক্রোসফট /en-us/library/aa175776(SQL.80).aspx NEW_ID বনাম RAND এর তুলনা করার জন্য ()
শ্যানন সিগারেন্স

উত্তর:


639
SELECT TOP 5 Id, Name FROM customerNames
ORDER BY NEWID()

এটি বলেছিল, আপনার প্রশ্নের আরও সাধারণ উত্তরের জন্য প্রত্যেকে এই পৃষ্ঠায় আসবে বলে মনে হচ্ছে:

এসকিউএল এ এলোমেলো সারি নির্বাচন করা হচ্ছে

মাইএসকিউএল সহ একটি এলোমেলো সারিটি নির্বাচন করুন:

SELECT column FROM table
ORDER BY RAND()
LIMIT 1

PostgreSQL সহ একটি এলোমেলো সারিটি নির্বাচন করুন:

SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

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

SELECT TOP 1 column FROM table
ORDER BY NEWID()

আইবিএম ডিবি 2 সহ একটি এলোমেলো সারি নির্বাচন করুন

SELECT column, RAND() as IDX 
FROM table 
ORDER BY IDX FETCH FIRST 1 ROWS ONLY

ওরাকল সহ একটি এলোমেলো রেকর্ড নির্বাচন করুন:

SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1

স্ক্লাইট সহ একটি এলোমেলো সারি নির্বাচন করুন:

SELECT column FROM table 
ORDER BY RANDOM() LIMIT 1

3
কোনও বহিরাগত সাইটের সাথে লিঙ্ক না করে সরাসরি এসওতে উত্তরগুলি পোস্ট করার জন্য +1 (স্বীকৃত উত্তরের মতো) যা ভবিষ্যতের ব্যবহারকারীরা এই প্রশ্নের দিকে তাকালে হ্রাস পেতে পারে।
রায় চিউ

17
এটি কি বড় টেবিলগুলিতে খুব ব্যয়বহুল হয়ে ওঠে, যেখানে প্রতিটি সারি একটি এলোমেলো সংখ্যা পায় এবং তারপরে একটি বড় আনইনডেক্সড র্যান্ডম নম্বর সেট বাছাই করা হয়?
অ্যান্ড্রে

এটি সম্ভবত বেশিরভাগ লোকের কাছেই সুস্পষ্ট, তবে এটি আমার কাছে স্পষ্ট ছিল না ... নিম্নলিখিত সন্ধানটি প্রতিটি সারির জন্য একটি নতুন এলোমেলো মান পাবে না: update tbl_vouchers set tbl_UsersID = (select top(1) id from tbl_Users order by NEWID()) - সম্পাদনা: মন্তব্যগুলিতে কাজ করার জন্য আমি বিন্যাস পেতে পারি না :(
মীর

তুমি জিনিয়াস! আমি আপনাকে অনেক ঘৃণা করি কারণ আমি না গিয়ে অবধি এটি দেখতে পেলাম না এবং সাব কোয়েরি এবং সারি সংখ্যাগুলির সাথে একটি দীর্ঘ দীর্ঘ ক্যোয়ারী লিখেছি।
গ্রিনকোড

5
সতর্কতা: বড় ডাটাবেসের জন্য এই পদ্ধতিটির খারাপ কার্য সম্পাদন হবে। ডাটাবেসে যদি মিলিয়ন মিলিয়ন প্রবেশাধিকার থাকে তবে আপনি কি প্রতিটি সারির জন্য এলোমেলো মান উত্পন্ন করতে সময় নিতে পারেন তা কি আপনি কল্পনা করতে পারেন? আপনার সম্পর্কে আরও তথ্য এবং একটি ভাল বিকল্প বিকল্প এখানে থাকতে পারে
ফ্রান্সিস নিগুকাম


11

যদি কেউ পোস্টগ্রিসএসকিউএল সমাধান চায়:

select id, name
from customer
order by random()
limit 5;

এই উত্তর পোস্টগ্রিসকিউএল এর জন্য ভাল, এটির সীমা দরকার নেই।
ওরফেবি

9

হতে পারে এই সাইটটি সহায়ক হবে।

যারা ক্লিক করতে চান না তাদের জন্য:

SELECT TOP 1 column FROM table
ORDER BY NEWID()

2
কমপক্ষে 1 এর সাথে 5 এর সাথে প্রতিস্থাপন করা উচিত
রোমান এম

7

এখানে একটি দুর্দান্ত মাইক্রোসফ্ট এসকিউএল সার্ভার 2005 নির্দিষ্ট সমাধান রয়েছে। আপনি যেখানে একটি বড় ফলাফলের সেট নিয়ে কাজ করছেন সেই সমস্যার সাথে ডিল করুন (আমি জানি না এমন প্রশ্ন নয়)।

বৃহৎ ছক থেকে এলোমেলোভাবে সারি নির্বাচন http://msdn.microsoft.com/en-us/library/cc441928.aspx


5

আপনার যদি কয়েক মিলিয়ন সারি সহ একটি টেবিল থাকে এবং পারফরম্যান্স সম্পর্কে যত্নশীল হন তবে এটি আরও ভাল উত্তর হতে পারে:

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

https://msdn.microsoft.com/en-us/library/cc441928.aspx


দ্রষ্টব্য যে এটি সারণীতে প্রায় 10% সারি নির্বাচন করবে। আপনার যদি সারিগুলির সঠিক সংখ্যা বা কমপক্ষে এন সারি নির্বাচন করতে হয় তবে এই পদ্ধতির কাজ হবে না।
লার্শ

4

এটি একটি পুরানো প্রশ্ন, তবে একটি বৃহত সংখ্যক সারি সহ একটি টেবিলে একটি নতুন ক্ষেত্রটি (হয় NEWID () বা অর্ডার বাই র্যান্ড ()) প্রয়োগ করার চেষ্টা করা ব্যয়বহুল ব্যয়বহুল। আপনার যদি ইনক্রিমেন্টাল, ইউনিক আইডি থাকে (এবং কোনও গর্ত না থাকে) তবে জিআইডি প্রয়োগ করার পরিবর্তে বা প্রতিটি একক সারির অনুরূপ আইডির এক্স # গণনা করা আরও কার্যকর হবে এবং তারপরে উপরের এক্স # নেওয়ার জন্য।

DECLARE @minValue int;
DECLARE @maxValue int;
SELECT @minValue = min(id), @maxValue = max(id) from [TABLE];

DECLARE @randomId1 int, @randomId2 int, @randomId3 int, @randomId4 int, @randomId5 int
SET @randomId1 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId2 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId3 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId4 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId5 = ((@maxValue + 1) - @minValue) * Rand() + @minValue

--select @maxValue as MaxValue, @minValue as MinValue
--  , @randomId1 as SelectedId1
--  , @randomId2 as SelectedId2
--  , @randomId3 as SelectedId3
--  , @randomId4 as SelectedId4
--  , @randomId5 as SelectedId5

select * from [TABLE] el
where el.id in (@randomId1, @randomId2, @randomId3, @randomId4, @randomId5)

আপনি যদি আরও অনেক সারি নির্বাচন করতে চান তবে আমি একটি আইডি এবং র‌্যান্ড () মানগুলির একটি গুচ্ছ দিয়ে একটি # টেম্পটেবল পপুলিংয়ের দিকে লক্ষ্য করব তবে ন্যূনতম-সর্বোচ্চ মানগুলিতে স্কেল করতে প্রতিটি র‌্যান্ড () মান ব্যবহার করুন। এইভাবে আপনাকে সমস্ত @ র্যান্ডমআইডি 1 ... এন পরামিতিগুলি সংজ্ঞায়িত করতে হবে না। আমি প্রাথমিক টেবিলটি জনপ্রিয় করতে সিটিই ব্যবহার করে নীচের উদাহরণটি অন্তর্ভুক্ত করেছি।

DECLARE @NumItems int = 100;

DECLARE @minValue int;
DECLARE @maxValue int;
SELECT @minValue = min(id), @maxValue = max(id) from [TABLE];
DECLARE @range int = @maxValue+1 - @minValue;

with cte (n) as (
   select 1 union all
   select n+1 from cte
   where n < @NumItems
)
select cast( @range * rand(cast(newid() as varbinary(100))) + @minValue as int) tp
into #Nt
from cte;

select * from #Nt ntt
inner join [TABLE] i on i.id = ntt.tp;

drop table #Nt;

@ প্রশংসনীয়, আপনার প্রস্তাবিত সম্পাদনাটি এলোমেলো নির্বাচনটি ভেঙে দিয়েছে। কমপক্ষে () এবং সর্বাধিক () ব্যবহার করে ডিবিওতে প্রয়োগ করা হয়েছে ally ট্যালি 64k টেবিলটি ব্যবহারকারীকে পিকে আইডি> 65556 সহ একটি সারি নির্বাচন করতে দেয় না।
রিয়ানগিলিস

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

@ প্রাগিগিউস আহ, আমি দেখতে পাচ্ছি যে, এখন আমি বিভ্রান্ত হয়ে পড়েছিলাম কারণ আপনি ন্যূনতম সর্বাধিক কাজ করার সময় 0-65k ব্যবহার করেছিলেন তবে পরে নয়। আপনার সাম্প্রতিক সম্পাদনার পরে আমি আপনাকে আপনার পরিবর্তনের পারফরম্যান্সের প্রভাবগুলি সম্পর্কে জিজ্ঞাসা করতে চেয়েছিলাম, কারণ পারফরম্যান্স টিউনিং আমার আগ্রহের মধ্যে একটি এবং সমান চিহ্নটির কোন দিকে আপনি কোনও কিছু রাখার মতো আপাতদৃষ্টিতে অর্থহীন সিদ্ধান্তগুলি আসলে একটি উল্লেখযোগ্য প্রভাব ফেলতে পারে - - একই জিনিস 5 এসটি @ র্যান্ডমআইড ## কলগুলিতে প্রয়োগ হবে? বা এটি অন্যরকম কারণ এটি প্রকৃত টেবিল থেকে নির্বাচন করছেন না?
রিয়ানগিলিস

আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি। আপনি কি জিজ্ঞাসা করছেন কেন কেবল 1 টি নির্বাচন @ আইডি 1 = র‌্যান্ড (), @ আইডি 2 = র‌্যান্ড () এর পরিবর্তে 5 টি সেট আছে ..? এটি কারণ যে 1 টি স্টেটমেন্টে একটি র‌্যান্ডে () একাধিক কল একই ফলাফল আনবে, তাই পৃথক SET। (এসএকিউএল সার্ভারে র‌্যান্ড () হ'ল একটি ডিস্ট্রিমেন্টিক ফাংশন, আমি বিশ্বাস করি)) আমি চাই অনুমান করব যে 1 টি বনাম 5 সেট ন্যানোসেকেন্ড পরিসরের কর্মক্ষমতা অনুযায়ী হবে।
প্রাক্তন

4
SELECT * FROM TABLENAME ORDER BY random() LIMIT 5; 

পুরানো প্রশ্ন, তবে এই উত্তরটি ওরাকলে আমার পক্ষে চলেনি।
ভালুক

* ফ্রম থেকে নির্বাচন করুন (DBMS_RANDOM.VALUE দ্বারা টেবিলের অর্ডার থেকে নির্বাচন করুন;) যেখানে রোম্যানাম <সংখ্যা; @ ভাল এটি চেষ্টা করুন
নরেন্দ্র

3

বড় ডেটার জন্য এটি সবচেয়ে ভাল কাজ করতে আমি খুঁজে পেয়েছি।

SELECT TOP 1 Column_Name FROM dbo.Table TABLESAMPLE(1 PERCENT);

TABLESAMPLE(n ROWS) or TABLESAMPLE(n PERCENT)এলোমেলো তবে TOP nসঠিক নমুনার আকার পেতে এটি যুক্ত করতে হবে।

NEWID()বড় টেবিলগুলিতে ব্যবহার করা খুব ধীর।


0

যেমনটি আমি এই নিবন্ধে ব্যাখ্যা করেছি , এসকিউএল ফলাফল সেটটি বদল করার জন্য আপনাকে একটি ডাটাবেস-নির্দিষ্ট ফাংশন কল ব্যবহার করতে হবে।

নোট করুন যে কোনও র‌্যান্ডম ফাংশনটি ব্যবহার করে একটি বৃহত ফলাফলের সেট বাছাই করা খুব ধীর হয়ে যেতে পারে, তাই এটি নিশ্চিত করুন যে আপনি ছোট ফলাফলের সেটগুলিতে এটি করছেন।

আপনি একটি বড় ফলাফল সেট অদলবদল এবং এটি পরে সীমিত করতে থাকে, তাহলে এটি মত ব্যবহার কিছু ভালো ওরাকলSAMPLE(N) বা TABLESAMPLEমধ্যে SQL সার্ভার বা পোস্টগ্রি পরিবর্তে দফার মাধ্যমে অনুক্রমে একটি র্যান্ডম ফাংশন।

সুতরাং, ধরে নিলাম আমাদের কাছে নিম্নলিখিত ডাটাবেস সারণি রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এবং songসারণীতে নিম্নলিখিত সারিগুলি :

| id | artist                          | title                              |
|----|---------------------------------|------------------------------------|
| 1  | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love                         |
| 2  | HAIM                            | Don't Save Me (Cyril Hahn Remix)   |
| 3  | 2Pac ft. DMX                    | Rise Of A Champion (GalilHD Remix) |
| 4  | Ed Sheeran & Passenger          | No Diggity (Kygo Remix)            |
| 5  | JP Cooper ft. Mali-Koa          | All This Love                      |

আকাশবাণী

ওরাকল-এ, আপনাকে DBMS_RANDOM.VALUEনিম্নলিখিত ফাংশনটি ব্যবহার করতে হবে, যেমন নীচের উদাহরণ দ্বারা চিত্রিত:

SELECT
    artist||' - '||title AS song
FROM song
ORDER BY DBMS_RANDOM.VALUE

ওরাকল-এ পূর্বোক্ত এসকিউএল কোয়েরিটি চালানোর সময়, আমরা নিম্নলিখিত ফলাফল সেটটি পেতে যাচ্ছি:

| song                                              |
|---------------------------------------------------|
| JP Cooper ft. Mali-Koa - All This Love            |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| HAIM - Don't Save Me (Cyril Hahn Remix)           |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix)  |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love      |

লক্ষ্য করুন যে গানগুলি এলোমেলোভাবে ক্রমে তালিকাভুক্ত করা হচ্ছে, DBMS_RANDOM.VALUEঅর্ডার বাই ক্লজ দ্বারা ব্যবহৃত ফাংশন কলকে ধন্যবাদ ।

SQL সার্ভার

এসকিউএল সার্ভারে আপনাকে NEWIDনিম্নলিখিত ফাংশনটি ব্যবহার করতে হবে, যেমন নীচের উদাহরণ দ্বারা চিত্রিত:

SELECT
    CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY NEWID()

এসকিউএল সার্ভারে পূর্বোক্ত এসকিউএল কোয়েরিটি চালানোর সময়, আমরা নিম্নলিখিত ফলাফল সেটটি পেতে যাচ্ছি:

| song                                              |
|---------------------------------------------------|
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love      |
| JP Cooper ft. Mali-Koa - All This Love            |
| HAIM - Don't Save Me (Cyril Hahn Remix)           |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix)  |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |

লক্ষ্য করুন যে গানগুলি এলোমেলোভাবে ক্রমে তালিকাভুক্ত করা হচ্ছে, NEWIDঅর্ডার বাই ক্লজ দ্বারা ব্যবহৃত ফাংশন কলকে ধন্যবাদ ।

পোস্টগ্রি

PostgreSQL এ, আপনাকে randomনিম্নলিখিত ফাংশনটি ব্যবহার করতে হবে, যেমন নীচের উদাহরণ দ্বারা চিত্রিত:

SELECT
    artist||' - '||title AS song
FROM song
ORDER BY random()

পোস্টগ্র্রেএসকিউএল-তে পূর্বোক্ত এসকিউএল কোয়েরিটি চালানোর সময় আমরা নিম্নলিখিত ফলাফল সেটটি পেতে যাচ্ছি:

| song                                              |
|---------------------------------------------------|
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love            |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix)  |
| HAIM - Don't Save Me (Cyril Hahn Remix)           |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love      |

লক্ষ্য করুন যে গানগুলি এলোমেলোভাবে ক্রমে তালিকাভুক্ত করা হচ্ছে, randomঅর্ডার বাই ক্লজ দ্বারা ব্যবহৃত ফাংশন কলকে ধন্যবাদ ।

মাইএসকিউএল

মাইএসকিউএল-তে আপনাকে RANDনীচের উদাহরণ দ্বারা চিত্রিত হিসাবে ফাংশনটি ব্যবহার করতে হবে :

SELECT
  CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY RAND()

মাইএসকিউএলে পূর্বোক্ত এসকিউএল কোয়েরিটি চালানোর সময়, আমরা নিম্নলিখিত ফলাফল সেটটি পেতে যাচ্ছি:

| song                                              |
|---------------------------------------------------|
| HAIM - Don't Save Me (Cyril Hahn Remix)           |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix)  |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love      |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love            |

লক্ষ্য করুন যে গানগুলি এলোমেলোভাবে ক্রমে তালিকাভুক্ত করা হচ্ছে, RANDঅর্ডার বাই ক্লজ দ্বারা ব্যবহৃত ফাংশন কলকে ধন্যবাদ ।


0

আপনি যদি বড় টেবিল ব্যবহার করেন এবং 10 শতাংশ ডেটা অ্যাক্সেস করতে চান তবে নিম্নলিখিত কমান্ডটি চালান: SELECT TOP 10 PERCENT * FROM Table1 ORDER BY NEWID();

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.