মাইএসকিএলে ক্রমিক সংখ্যায় ফাঁকগুলি কীভাবে খুঁজে পাবেন?


119

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

select count(id) from arrc_vouchers where id between 1 and 100

100 ফিরিয়ে নেওয়া উচিত, তবে এটি পরিবর্তে 87 ফেরত আসবে। আমি কি চালাতে পারি এমন কোনও জিজ্ঞাসা রয়েছে যা অনুপস্থিত সংখ্যার মানগুলি ফিরিয়ে দেবে? উদাহরণস্বরূপ, রেকর্ডগুলি আইডি 1-70 এবং 83-100 এর জন্য উপস্থিত থাকতে পারে তবে 71-82 এর আইডির কোনও রেকর্ড নেই। আমি 71, 72, 73, ইত্যাদি ফিরিয়ে দিতে চাই

এটা কি সম্ভব?


এটি মাইএসকিউএলে কাজ করতে পারে না, তবে কর্মক্ষেত্রে (ওরাকল) আমাদের অনুরূপ কিছু প্রয়োজন। আমরা একটি স্টোরকড প্রোক লিখেছি যা সর্বাধিক মান হিসাবে একটি সংখ্যা নিয়েছিল। স্টোরড প্রোক এর পরে একটি কলাম সহ একটি টেম্প টেবিল তৈরি করেছে। সারণীতে 1 থেকে সর্বোচ্চ পর্যন্ত সমস্ত সংখ্যা রয়েছে। তারপরে এটি টেম্প টেবিল এবং আমাদের আগ্রহের টেবিলের মধ্যে যোগ দেয় নি। যদি আপনি এটিকে আরসি_ভিউচার্স থেকে সর্বোচ্চ = নির্বাচন করুন সর্বাধিক (আইডি) দিয়ে থাকেন তবে এটি সমস্ত অনুপস্থিত মান ফিরে আসবে।
সাউন্ডারেল

2
সংখ্যায় ফাঁক থাকার ক্ষেত্রে কী ভুল? একটি সারোগেট কীটির মান সাধারণত অর্থবহ হয় না; সমস্ত গুরুত্বপূর্ণ এটি অনন্য। যদি আপনার অ্যাপ্লিকেশনটি অ-স্বচ্ছ আইডিগুলি পরিচালনা করতে না পারে তবে এটি সম্ভবত অ্যাপ্লিকেশনটিতে একটি ত্রুটিযুক্ত তথ্য নয়,
উইজার্ড

4
এই ক্ষেত্রে এটি একটি সমস্যা কারণ আমরা পুরানো সিস্টেম থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ডেটা লোকেদের কাছে হস্তান্তরিত ফিজিক্যাল কার্ডে মুদ্রণের জন্য একটি রেকর্ডের সাথে যুক্ত অটো-ইনক্রিমেন্ট নম্বর ব্যবহার করে। এটি আমাদের ধারণা ছিল না। কোন কার্ডগুলি অনুপস্থিত রয়েছে তা অনুসন্ধানের জন্য, আমাদের জানতে হবে ক্রমিক সংখ্যা অনুসারে ফাঁকগুলি কোথায়।
এমিএস

xaprb.com/blog/2005/12/06/… select l.id + 1 as start from sequence as l left outer join sequence as r on l.id + 1 = r.id where r.id is null;

আপনি আপনার টেবিলের সর্বোচ্চ আইডি থেকে 1 নম্বর পর্যন্ত জেনারেট জেনারেট ব্যবহার করতে পারেন। তারপরে একটি কোয়েরি চালান যেখানে এই সিরিজে আইডি নেই।
Tsvetelin Salutski

উত্তর:


170

হালনাগাদ

পারফরম্যান্সের ক্ষেত্রে কনফেক্সিয়ান এমজেএস আরও ভাল উত্তর সরবরাহ করেছে ।

(যত দ্রুত সম্ভব) উত্তর

এখানে এমন সংস্করণ যা কোনও আকারের টেবিলটিতে কাজ করে (কেবল 100 টি সারি নয়):

SELECT (t1.id + 1) as gap_starts_at, 
       (SELECT MIN(t3.id) -1 FROM arrc_vouchers t3 WHERE t3.id > t1.id) as gap_ends_at
FROM arrc_vouchers t1
WHERE NOT EXISTS (SELECT t2.id FROM arrc_vouchers t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL
  • gap_starts_at - বর্তমান ফাঁকে প্রথম আইডি
  • gap_ends_at - বর্তমান ফাঁকের শেষ আইডি

6
আমি এমনকি সেই সংস্থার হয়েও কাজ করছি না, তবে এটি আমি দেখেছি সেরা উত্তর এবং ভবিষ্যতের রেফারেন্সের জন্য এটি অবশ্যই স্মরণযোগ্য। ধন্যবাদ!
এম্মি

4
এটির সাথে একমাত্র সমস্যাটি হ'ল এটি সম্ভাব্য প্রাথমিক ফাঁকটিকে "রিপোর্ট" করে না। উদাহরণস্বরূপ, যদি প্রথম 5 আইডি নিখোঁজ হয় (1 থেকে 5 এর মধ্যে) এটি এটি দেখায় না ... আমরা খুব ভিক্ষা করার সময় কীভাবে প্রসারণীয় ফাঁকগুলি প্রদর্শন করতে পারি?
দিয়েগোডিডি

দ্রষ্টব্য: এই কোয়েরিটি অস্থায়ী টেবিলগুলিতে কাজ করে না। আমার সমস্যাটি হ'ল order numberআমি ফাঁকগুলি অনুসন্ধান করে যাচ্ছিলাম তা আলাদা নয় (টেবিলগুলি অর্ডার লাইনগুলিকে সঞ্চয় করে, তাই তারা প্রতিটি লাইনের পুনরাবৃত্তির অর্ডার নম্বর)। 1 ম ক্যোয়ারী: 2812 সারি সেট (1 মিনিট 31.09 সেকেন্ড) । স্বতন্ত্র অর্ডার নম্বর নির্বাচন করে অন্য একটি সারণী তৈরি করুন। আমার পুনরাবৃত্তি ছাড়াই আপনার জিজ্ঞাসা: 1009 সারি সেট (18.04 সেকেন্ড)
ক্রিস কে

1
@ ডিগো ডিডি এর সাথে কী হয়েছে SELECT MIN(id) FROM table?
এয়ার

8
কাজ করেছেন তবে but০০০০০০ রেকর্ড সহ একটি টেবিলে চালাতে প্রায় 5 ঘন্টা সময় লেগেছে
ম্যাট

98

এটি কেবলমাত্র আমার জন্য টেবিলের মধ্যে 80k এরও বেশি সারিগুলির ফাঁকগুলি খুঁজে পেতে কাজ করেছে:

SELECT
 CONCAT(z.expected, IF(z.got-1>z.expected, CONCAT(' thru ',z.got-1), '')) AS missing
FROM (
 SELECT
  @rownum:=@rownum+1 AS expected,
  IF(@rownum=YourCol, 0, @rownum:=YourCol) AS got
 FROM
  (SELECT @rownum:=0) AS a
  JOIN YourTable
  ORDER BY YourCol
 ) AS z
WHERE z.got!=0;

ফলাফল:

+------------------+
| missing          |
+------------------+
| 1 thru 99        |
| 666 thru 667     |
| 50000            |
| 66419 thru 66456 |
+------------------+
4 rows in set (0.06 sec)

নোট করুন যে কলামগুলির ক্রম expectedএবং gotসমালোচনামূলক।

আপনি যদি জানেন যে YourColএটি 1 থেকে শুরু হয় না এবং এটি কোনও বিষয় নয় তবে আপনি প্রতিস্থাপন করতে পারেন

(SELECT @rownum:=0) AS a

সঙ্গে

(SELECT @rownum:=(SELECT MIN(YourCol)-1 FROM YourTable)) AS a

নতুন ফলাফল:

+------------------+
| missing          |
+------------------+
| 666 thru 667     |
| 50000            |
| 66419 thru 66456 |
+------------------+
3 rows in set (0.06 sec)

যদি আপনার অনুপস্থিত আইডিগুলিতে কোনও ধরণের শেল স্ক্রিপ্ট টাস্ক সম্পাদন করতে হয়, আপনি সরাসরি ব্যাশ দিয়ে পুনরুক্তি করতে পারেন এমন একটি এক্সপ্রেশন তৈরি করতে এই বৈকল্পিকটি ব্যবহার করতে পারেন।

SELECT GROUP_CONCAT(IF(z.got-1>z.expected, CONCAT('$(',z.expected,' ',z.got-1,')'), z.expected) SEPARATOR " ") AS missing
FROM (  SELECT   @rownum:=@rownum+1 AS expected,   IF(@rownum=height, 0, @rownum:=height) AS got  FROM   (SELECT @rownum:=0) AS a   JOIN block   ORDER BY height  ) AS z WHERE z.got!=0;

এটি যেমন একটি আউটপুট উত্পাদন করে

$(seq 1 99) $(seq 666 667) 50000 $(seq 66419 66456)

তারপরে প্রতিটি আইডির জন্য কমান্ড চালানোর জন্য আপনি এটি বাশ টার্মিনালে লুপের জন্য অনুলিপি করে কপি করতে পারেন

for ID in $(seq 1 99) $(seq 666 667) 50000 $(seq 66419 66456); do
  echo $ID
  # fill the gaps
done

এটি উপরের মতো একই জিনিস, কেবল এটি পাঠযোগ্য এবং কার্যকর কার্যকর উভয়ই। উপরের "কনক্যাট" কমান্ডটি পরিবর্তন করে, অন্যান্য প্রোগ্রামিং ভাষার জন্য সিনট্যাক্স তৈরি করা যেতে পারে। অথবা এমনকি এসকিউএল এমনকি।


8
চমৎকার সমাধান, আমার জন্য এটি পছন্দসই উত্তরের চেয়ে ভাল - ধন্যবাদ
উই জেল

6
তার অনেক গৃহীত উত্তর অধিক কার্যকরী।
সিমকিবিয়ান

1
গৃহীত উত্তরের চেয়ে অনেক দ্রুত। কেবলমাত্র আমি যুক্ত CONVERT( YourCol, UNSIGNED )করব তা হ'ল যদি আপনার কল ইতিমধ্যে কোনও পূর্ণসংখ্যা না হয় তবে আরও ভাল ফলাফল দেওয়া হবে।
বার্টন চিত্তেনডেন

1
@ আলেকজান্দ্রে ক্যাসাগন: আমি যদি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি, তবে মিনিট সন্ধানের জন্য আমি এমবেডডের মতো একটি পৃথক ক্যোয়ারী SELECT MAX(YourCol) FROM YourTable;
করবো

1
@ মেটুরি প্রয়োজনে GROUP_CONCAT ভেরিয়েন্টে স্যুইচ করুন:SELECT IF((z.got-IF(z.over>0, z.over, 0)-1)>z.expected, CONCAT(z.expected,' thru ',(z.got-IF(z.over>0, z.over, 0)-1)), z.expected) AS missing FROM ( SELECT @rownum:=@rownum+1 AS expected, @target-@missing AS under, (@missing:=@missing+IF(@rownum=YourCol, 0, YourCol-@rownum))-@target AS over, IF(@rownum=YourCol, 0, @rownum:=YourCol) AS got FROM (SELECT @rownum:=0, @missing:=0, @target:=10) AS a JOIN YourTable ORDER BY YourCol ) AS z WHERE z.got!=0 AND z.under>0;
কনফেক্সিয়ান এমজেএস

11

দ্রুত এবং নোংরা ক্যোয়ারী যাতে কৌশলটি করা উচিত:

SELECT a AS id, b AS next_id, (b - a) -1 AS missing_inbetween
FROM 
 (
SELECT a1.id AS a , MIN(a2.id) AS b 
FROM arrc_vouchers  AS a1
LEFT JOIN arrc_vouchers AS a2 ON a2.id > a1.id
WHERE a1.id <= 100
GROUP BY a1.id
) AS tab

WHERE 
b > a + 1

এটি আপনাকে একটি সারণী দেবে যা তার উপরে আইডি নিখোঁজ রয়েছে এবং পরবর্তী_আইডি উপস্থিত রয়েছে এবং কতজনের মধ্যে নিখোঁজ রয়েছে ... উদাহরণস্বরূপ

 
আইডি নেক্সট_আইডি নিখোঁজ_ইন বিটুইন
 1 4 2
68 70 1
75 87 11

1
এটি আমার জন্য কাজ করে মহান। ধন্যবাদ।! আমি আমার উদ্দেশ্যে এটি সহজেই সংশোধন করতে সক্ষম হয়েছি।
রহিম খোজা

ফাঁক করে 'পরবর্তী আইডি' সন্ধান করার সময় এটি সেরা উত্তর বলে মনে হয়। দুর্ভাগ্যক্রমে 10 টি সারি সারণীগুলির জন্য এটি অত্যন্ত ধীর। আমি K 46 কে টেবিলের জন্য 10 মিনিটেরও বেশি অপেক্ষা করেছি যখন @ কনফেক্সিয়ান এমজেএস দিয়ে আমি এক সেকেন্ডেরও কম ফলাফল পেয়েছি!
MakeBackCommodore64

5

আপনি যদি সিক্যুয়েন্স স্টোরেজ ইঞ্জিনMariaDB ব্যবহার করে আপনার একটি দ্রুত (800%) বিকল্প ব্যবহার করেন :

SELECT * FROM seq_1_to_50000 WHERE SEQ NOT IN (SELECT COL FROM TABLE);

2
এই ধারণাটি প্রসারিত করতে, ক্রমটি সর্বাধিক প্রতিষ্ঠিত হতে পারে "SELECT MAX(column) FROM table"এবং ফলাফলটি থেকে একটি ভেরিয়েবল সেট করে বলা যায় $ ম্যাক্স ... এসকিউএল স্টেটমেন্টটি লেখা যেতে পারে "SELECT * FROM seq_1_to_". $MAX ." WHERE seq not in (SELECT column FROM table)" আমার সিনট্যাক্স পিএইচপি ভিত্তিক
me_

অথবা আপনি SELECT @var:= max FROM ....; select * from .. WHERE seq < @max;মাইএসকিউএল ভেরিয়েবলগুলি ব্যবহার করতে পারেন ।
মোশে এল

2

100 টি সারি এবং 1-100 মান সহ একটি একক কলাম সহ একটি অস্থায়ী সারণী তৈরি করুন।

আউটার আপনার আরআরসি_উউচার টেবিলে এই টেবিলটিতে যোগ দিন এবং একক কলাম মানগুলি নির্বাচন করুন যেখানে আরআরসি_উউচার আইডি নাল।

এই অন্ধ কোডিং, কিন্তু কাজ করা উচিত।

select tempid from temptable 
left join arrc_vouchers on temptable.tempid = arrc_vouchers.id 
where arrc_vouchers.id is null

ঠিক আছে, 1 - 100 একটি উদাহরণ দেওয়ার সহজ উপায় ছিল। এই ক্ষেত্রে, আমরা 20,000 - 85,000 এ খুঁজছি। সুতরাং আমি কি 6500 সারি 20000 - 85000 নম্বরযুক্ত একটি টেম্প টেবিল তৈরি করব? এবং আমি কীভাবে এটি করতে যাব? আমি পিএইচপিএমআইএডমিন ব্যবহার করছি; যদি আমি কলামটির ডিফল্ট মান 25000 এ সেট করে এবং এটি স্বয়ংক্রিয় বৃদ্ধি করি তবে আমি কি কেবল 65,000 সারি সন্নিবেশ করতে পারি এবং এটি 25000 দিয়ে স্বয়ংক্রিয় বৃদ্ধি শুরু করবে?
EmmyS

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

2

একটি বিকল্প সমাধান যার জন্য একটি ক্যোয়ারী + কিছু কোড প্রসেসিংয়ের কিছু কোডের প্রয়োজন তা হ'ল:

select l.id lValue, c.id cValue, r.id rValue 
  from 
  arrc_vouchers l 
  right join arrc_vouchers c on l.id=IF(c.id > 0, c.id-1, null)
  left  join arrc_vouchers r on r.id=c.id+1
where 1=1
  and c.id > 0 
  and (l.id is null or r.id is null)
order by c.id asc;

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

এটি সেন্ট্রালভ্যালুতে (সিভালু) প্রতি একটি প্রবেশ ফিরিয়ে দেবে যা এর চেয়ে কম মান (lValue) বা বৃহত্তর মান (rValue) নেই, যেমন:

lValue |cValue|rValue
-------+------+-------
{null} | 2    | 3      
8      | 9    | {null} 
{null} | 22   | 23     
23     | 24   | {null} 
{null} | 29   | {null} 
{null} | 33   | {null} 


আরও বিশদে না গিয়ে (আমরা তাদের পরবর্তী অনুচ্ছেদে দেখব) এই আউটপুটটির অর্থ এই:

  • 0 এবং 2 এর মধ্যে কোনও মান নেই
  • 9 এবং 22 এর মধ্যে কোনও মান নেই
  • 24 এবং 29 এর মধ্যে কোনও মান নেই
  • 29 এবং 33 এর মধ্যে কোনও মান নেই
  • 33 এবং MAX VALUE এর মধ্যে কোনও মান নেই

সুতরাং মূল ধারণাটি হ'ল একটি নিখরচায় করা এবং বাম দিকে একই টেবিলের সাথে যোগ দিয়ে দেখুন আমাদের প্রতি মূল্য অনুসারে সংলগ্ন মান রয়েছে কিনা (যেমন: কেন্দ্রীয় মান যদি '3' হয় তবে আমরা বাম দিকে 3-1 = 2 এবং 3 + 1 এ পরীক্ষা করে দেখি) ডান), এবং যখন কোনও ROW এর ডান বা বাম দিকে একটি নাল মান হয় তখন আমরা জানি যে কোনও সংলগ্ন মান নেই।

আমার টেবিলের সম্পূর্ণ কাঁচা আউটপুট হল:

select * from arrc_vouchers order by id asc;

0  
2  
3  
4  
5  
6  
7  
8  
9  
22 
23 
24 
29 
33 

কিছু নোট:

  1. যোগদানের শর্তে এসকিউএল যদি বিবৃতি প্রয়োজন হয় যদি আপনি 'আইডি' ক্ষেত্রটিকে UNSIGNED হিসাবে সংজ্ঞায়িত করেন, সুতরাং এটি আপনাকে শূন্যের নীচে হ্রাস করতে দেবে না। এটি পরবর্তী নোটে যেমন বলা হয়েছে আপনি c.value> 0 রাখেন তবে এটি কঠোরভাবে প্রয়োজন হয় না তবে আমি এটিকে কেবল ডক হিসাবে অন্তর্ভুক্ত করছি।
  2. আমরা আগের কোনও মানটিতে আগ্রহী না হওয়ায় আমি শূন্য কেন্দ্রীয় মান ফিল্টার করছি এবং আমরা পরবর্তী সারিতে পোস্টের মানটি পেতে পারি।

2

যদি দুটি সংখ্যার (যেমন 1,3,5,6) এর মধ্যে সর্বাধিক একের ফাঁক থাকার অনুক্রম থাকে তবে ব্যবহৃত ক্যোয়ারীটি হ'ল:

select s.id+1 from source1 s where s.id+1 not in(select id from source1) and s.id+1<(select max(id) from source1);
  • টেবিলের নাম - source1
  • কলাম_নাম - id

1

লুসেকের উপরোক্ত উত্তরের উপর ভিত্তি করে এই সঞ্চিত পদ্ধতিটি আপনাকে অবিচ্ছিন্ন রেকর্ডগুলি সন্ধান করার জন্য পরীক্ষা করতে চান এমন টেবিল এবং কলামের নাম নির্দিষ্ট করতে দেয় - এইভাবে মূল প্রশ্নের উত্তর দেওয়া এবং এটি প্রমাণ করা যে কীভাবে @var কে টেবিলগুলি উপস্থাপন করতে পারে এবং / অথবা একটি সঞ্চিত পদ্ধতিতে কলামগুলি।

create definer=`root`@`localhost` procedure `spfindnoncontiguous`(in `param_tbl` varchar(64), in `param_col` varchar(64))
language sql
not deterministic
contains sql
sql security definer
comment ''
begin
declare strsql varchar(1000);
declare tbl varchar(64);
declare col varchar(64);

set @tbl=cast(param_tbl as char character set utf8);
set @col=cast(param_col as char character set utf8);

set @strsql=concat("select 
    ( t1.",@col," + 1 ) as starts_at, 
  ( select min(t3.",@col,") -1 from ",@tbl," t3 where t3.",@col," > t1.",@col," ) as ends_at
    from ",@tbl," t1
        where not exists ( select t2.",@col," from ",@tbl," t2 where t2.",@col," = t1.",@col," + 1 )
        having ends_at is not null");

prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
end

1

আমি এটি বিভিন্ন শিষ্টাচারে চেষ্টা করেছি এবং আমি যে সেরা পারফরম্যান্স পেয়েছি তা হল এই সাধারণ প্রশ্নটি:

select a.id+1 gapIni
    ,(select x.id-1 from arrc_vouchers x where x.id>a.id+1 limit 1) gapEnd
    from arrc_vouchers a
    left join arrc_vouchers b on b.id=a.id+1
    where b.id is null
    order by 1
;

... পরের আইডিটি উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে একটি বাম যোগ দিন , কেবল যদি পরবর্তীটি পাওয়া না যায় তবেই সাবকিউরিটি পরবর্তী আইডিটি খুঁজে পায় যা ফাঁক শেষের সন্ধান করতে পারে। আমি এটি করেছি কারণ সমান (=) এর সাথে ক্যোয়ারী (>) অপারেটরের চেয়ে বড় পারফরম্যান্স ।

স্কেলফিল্ড ব্যবহার করে এটি অন্যের ক্যোয়ারের মতো আলাদা পারফরম্যান্স প্রদর্শন করে না তবে একটি বাস্তব ডাটাবেসে এই কোয়েরিতে উপরের ফলাফলটি অন্যদের চেয়ে 3 গুণ বেশি দ্রুত fast

স্কিমা:

CREATE TABLE arrc_vouchers (id int primary key)
;
INSERT INTO `arrc_vouchers` (`id`) VALUES (1),(4),(5),(7),(8),(9),(10),(11),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28),(29)
;

পারফরম্যান্সের তুলনা করতে আমি যে সমস্ত জিজ্ঞাসা করেছি সেগুলি অনুসরণ করুন:

select a.id+1 gapIni
    ,(select x.id-1 from arrc_vouchers x where x.id>a.id+1 limit 1) gapEnd
    from arrc_vouchers a
    left join arrc_vouchers b on b.id=a.id+1
    where b.id is null
    order by 1
;
select *, (gapEnd-gapIni) qt
    from (
        select id+1 gapIni
        ,(select x.id from arrc_vouchers x where x.id>a.id limit 1) gapEnd
        from arrc_vouchers a
        order by id
    ) a where gapEnd <> gapIni
;
select id+1 gapIni
    ,(select x.id from arrc_vouchers x where x.id>a.id limit 1) gapEnd
    #,coalesce((select id from arrc_vouchers x where x.id=a.id+1),(select x.id from arrc_vouchers x where x.id>a.id limit 1)) gapEnd
    from arrc_vouchers a
    where id+1 <> (select x.id from arrc_vouchers x where x.id>a.id limit 1)
    order by id
;
select id+1 gapIni
    ,coalesce((select id from arrc_vouchers x where x.id=a.id+1),(select x.id from arrc_vouchers x where x.id>a.id limit 1)) gapEnd
    from arrc_vouchers a
    order by id
;
select id+1 gapIni
    ,coalesce((select id from arrc_vouchers x where x.id=a.id+1),concat('*** GAT *** ',(select x.id from arrc_vouchers x where x.id>a.id limit 1))) gapEnd
    from arrc_vouchers a
    order by id
;

হতে পারে এটি কাউকে সাহায্য করে এবং দরকারী।

আপনি আমার স্কোরিফিল্ডটি ব্যবহার করে আমার ক্যোয়ারীটি দেখতে এবং পরীক্ষা করতে পারেন :

http://sqlfiddle.com/#!9/6bdca7/1


0

যদিও এগুলি সমস্ত কাজ করে বলে মনে হচ্ছে, যখন ফলাফলটি 50,000 রেকর্ড রয়েছে তখন খুব দীর্ঘ সময়ে ফিরে আসে।

আমি এটি ব্যবহার করেছি এবং এটি কোয়েরি থেকে আরও দ্রুত ফিরে আসার সাথে ফাঁক বা পরবর্তী উপলব্ধ (সর্বশেষ ব্যবহৃত +1) সন্ধান করে।

SELECT a.id as beforegap, a.id+1 as avail
FROM table_name a
where (select b.id from table_name b where b.id=a.id+1) is null
limit 1;

এটি প্রথম ফাঁকটি আবিষ্কার করে যা প্রশ্নটি চেয়েছিল তা নয়।
আকর্ষণ করুন

0

সম্ভবত প্রাসঙ্গিক নয়, তবে আমি সংখ্যার অনুক্রমের ফাঁকগুলি তালিকা করতে এই জাতীয় কিছুটির সন্ধান করছিলাম এবং এই পোস্টটি পেয়েছি, যা আপনি যা খুঁজছেন ঠিক তার উপর নির্ভর করে একাধিক বিভিন্ন সমাধান রয়েছে। আমি সিকোয়েন্সে প্রথম উপলব্ধ ফাঁকটি খুঁজছিলাম (অর্থাত্ পরবর্তী পরবর্তী সংখ্যা) এবং এটি মনে হয় ঠিক আছে।

এমআইএন (l.number_sequence + 1) নির্বাচন করুন রোগীদের কাছ থেকে l লেফট আউটয়ার জয়েন হিসাবে রোগীদের কাছ থেকে l.number_sequence + 1 = r.number_sequence যেখানে r.number_sequence হয় নাল। ২০০৫ সাল থেকে সেখানে আরও বেশ কয়েকটি পরিস্থিতি ও সমাধান আলোচনা করা হয়েছে!

এসকিউএল সহ একটি সিকোয়েন্সে কীভাবে হারিয়ে যাওয়া মূল্যবোধগুলি খুঁজে পাবেন

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