mysql কশন একটি এসকিউএল ডাটাবেস টেবিলের মধ্যে nth সারি নির্বাচন করুন কিভাবে?




এসকিউএল ইনজেকশন (24)

যখন আমরা MSSQL 2000 তে কাজ করতাম, তখন আমরা "ট্রিপল-ফ্লিপ" নামক কাজটি করি।

সম্পাদিত

DECLARE @InnerPageSize int
DECLARE @OuterPageSize int
DECLARE @Count int

SELECT @Count = COUNT(<column>) FROM <TABLE>
SET @InnerPageSize = @PageNum * @PageSize
SET @OuterPageSize = @Count - ((@PageNum - 1) * @PageSize)

IF (@OuterPageSize < 0)
    SET @OuterPageSize = 0
ELSE IF (@OuterPageSize > @PageSize)
    SET @OuterPageSize = @PageSize

DECLARE @sql NVARCHAR(8000)

SET @sql = 'SELECT * FROM
(
    SELECT TOP ' + CAST(@OuterPageSize AS nvarchar(5)) + ' * FROM
    (
        SELECT TOP ' + CAST(@InnerPageSize AS nvarchar(5)) + ' * FROM <TABLE> ORDER BY <column> ASC
    ) AS t1 ORDER BY <column> DESC
) AS t2 ORDER BY <column> ASC'

PRINT @sql
EXECUTE sp_executesql @sql

এটি মার্জিত ছিল না, এবং এটি দ্রুত ছিল না, কিন্তু এটি কাজ করে।

আমি কিছু ডাটাবেস টেবিলের থেকে n তম সারি নির্বাচন করার (কিছুক্ষন) ডাটাবেস অগ্নিকুণ্ড পদ্ধতিগুলি শিখতে আগ্রহী। নিম্নলিখিত ডেটাবেসের স্থানীয় কার্যকারিতা ব্যবহার করে এটি কীভাবে অর্জন করা যায় তা দেখতে আকর্ষণীয় হবে:

  • SQL সার্ভার
  • মাইএসকিউএল
  • পোস্টগ্রি
  • SQLite
  • আকাশবাণী

আমি বর্তমানে এসকিউএল সার্ভার 2005-এ নিম্নলিখিত মত কিছু করছি, তবে আমি অন্যের আরও অগোছালো পন্থাগুলি দেখতে আগ্রহী হব:

WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000

উপরের এসকিউএল এর জন্য ক্রেডিট: ফিরোজ আনসারির ওয়েব্লগ

আপডেট: এসকিউএল মান সম্পর্কিত ট্রোজেল আর্মিনের উত্তর দেখুন। ট্রোজেল, আপনি কি কোন লিঙ্ক আমরা উদ্ধৃত করতে পারেন আছে?


Sybase এসকিউএল কোথাও:

SELECT TOP 1 START AT n * from table ORDER BY whatever

ORDER দ্বারা বা এটি অর্থহীন ভুলবেন না।


ওরাকল OFFSET..FETCH..ROWS , আপনি OFFSET..FETCH..ROWS বিকল্পটি ORDER BY ব্যবহার করতে পারেন

উদাহরণস্বরূপ, শীর্ষ থেকে তৃতীয় রেকর্ড পেতে:

SELECT * 
FROM   sometable
ORDER BY column_name
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;

PostgreSQLLIMIT / OFFSET সিনট্যাক্স হল:

SELECT
    *
FROM
    mytable
ORDER BY
    somefield
LIMIT 1 OFFSET 20;

এই উদাহরণটি 21 তম সারি নির্বাচন করে। OFFSET 20 পোস্টগ্রেসকে প্রথম ২0 টি রেকর্ড বাদ দিতে বলছে। যদি আপনি ধারা অনুসারে কোন ORDER BY নির্দিষ্ট না করেন তবে কোন গ্যারান্টি নেই যা আপনি ফিরে পাবেন, যা খুব কমই দরকারী।

স্পষ্টত এসকিউএল মান পাগল উইন্ডিং ফাংশন বাইরে সীমা সমস্যা নীরব হয়, যার ফলে সবাই এটি ভিন্নভাবে প্রয়োগ করে।


যোগ করুন

LIMIT n,1

ফলাফল ফলাফল থেকে শুরু করে এক ফলাফলের ফলাফল সীমাবদ্ধ করবে।


1 ছোট পরিবর্তন: n পরিবর্তে n-1।

select *
from thetable
limit n-1, 1

SELECT * FROM emp a
WHERE  n = (SELECT COUNT( _rowid)
              FROM emp b
             WHERE a. _rowid >= b. _rowid);

select * from 
(select * from ordered order by order_id limit 100) x order by 
x.order_id desc limit 1;

প্রথমে শীর্ষস্থানে 100 সারি নির্বাচন করুন এবং তারপরে নিম্নমানের ক্রম অনুসারে ক্রমটি নির্বাচন করুন এবং 1 পর্যন্ত সীমাবদ্ধ করুন। তবে এটি একটি অত্যন্ত ব্যয়বহুল বিবৃতি যা দুইবার ডেটা অ্যাক্সেস করে।


অবিশ্বাস্য যে আপনি এটি একটি এক্সিকিউটিভ একটি এসকিউএল ইঞ্জিন খুঁজে পেতে পারেন ...

WITH sentence AS
(SELECT 
    stuff,
    row = ROW_NUMBER() OVER (ORDER BY Id)
FROM 
    SentenceType
    )
SELECT
    sen.stuff
FROM sentence sen
WHERE sen.row = (ABS(CHECKSUM(NEWID())) % 100) + 1

এসকিউএল সার্ভারের জন্য, সারি নম্বরের মাধ্যমে যাওয়ার একটি সাধারণ উপায় হল: SET ROWCOUNT @row - @ row = আপনি যে সারি নম্বরটি কাজ করতে চান সেটি।

উদাহরণ স্বরূপ:

rowcount 20 সেট - 20 সারি সারি সারি

মাংস নির্বাচন করুন, dbo.sandwich থেকে পনির - 20 তম সারিতে টেবিল থেকে কলাম নির্বাচন করুন

rowcount 0 সেট করুন - সারি সারি সারি সারি সারি

এই 20th সারির তথ্য ফিরে আসবে। পরে rowcount 0 রাখা নিশ্চিত করুন।

আমি অদৃশ্য জানি, কিন্তু আমি একটি এসকিউএল নোব এবং আমি এটা ব্যবহার করেছি তাই আমি কি বলতে পারি?


ওরাকল:

select * from (select foo from bar order by foo) where ROWNUM = x

আমি বিশ্রাম সম্পর্কে নিশ্চিত নই, কিন্তু আমি জানি SQLite এবং MySQL এর কোনও "ডিফল্ট" সারি ক্রম নেই। সেই দুটি উপভাষায়, অন্তত, নীচের স্নিপেটটি _table থেকে 15 তম এন্ট্রি ধারণ করে, এটি যুক্ত হওয়ার তারিখ / সময় অনুসারে সাজানো:

SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15

(অবশ্যই, আপনার একটি অতিরিক্ত DATETIME ক্ষেত্র থাকা দরকার এবং এন্ট্রি যোগ করা তারিখ / সময়তে সেট করুন ...)


আমার মনে হয়, দক্ষ হতে হলে, আপনাকে 1) একটি ডাটাবেস রেকর্ডের চেয়ে 0 এবং একের মধ্যে একটি র্যান্ডম সংখ্যা তৈরি করতে হবে, এবং ২) সেই অবস্থানে সারি নির্বাচন করতে সক্ষম হবেন। দুর্ভাগ্যক্রমে, বিভিন্ন ডেটাবেসে বিভিন্ন র্যান্ডম নম্বর জেনারেটর এবং ফলাফল সেটের অবস্থানে একটি সারি নির্বাচন করার বিভিন্ন উপায় রয়েছে - সাধারণত আপনি কতগুলি সারি ছাড়তে চান এবং কত সারি আপনি চান তা নির্দিষ্ট করুন তবে এটি বিভিন্ন উপাত্তগুলির জন্য ভিন্নভাবে কাজ করে। এখানে SQLite এ আমার জন্য কাজ করে এমন কিছু

select * 
from Table 
limit abs(random()) % (select count(*) from Words), 1;

এটি সীমা বিভাগে একটি উপসর্গ ব্যবহার করতে সক্ষম হওয়ার উপর নির্ভর করে (যা SQLite এর মধ্যে LIMIT <skips>, <recs> নিতে>) টেবিলের রেকর্ডগুলির সংখ্যা নির্বাচন করা বিশেষভাবে কার্যকর হওয়া উচিত, ডাটাবেসের অংশ হিসাবে মেটা তথ্য, কিন্তু যে ডাটাবেসের বাস্তবায়ন উপর নির্ভর করে। এছাড়াও, আমি জানি না এনটি রেকর্ডটি পুনরুদ্ধারের আগে কোয়েরি প্রকৃতপক্ষে ফলাফল সেটটি তৈরি করবে কিনা, তবে আমি আশা করি এটির প্রয়োজন নেই। মনে রাখবেন যে আমি "অর্ডার দ্বারা" ধারাটি নির্দিষ্ট করছি না। এটি প্রাথমিক কী মত কিছু "অর্ডার করে" ভালো হতে পারে, যা একটি সূচী থাকবে - যদি সূচী থেকে Nth রেকর্ডটি দ্রুত হতে পারে তবে ডাটাবেসটি ফলাফল সেট নির্মান ছাড়াই ডেটাবেস থেকে এনথ রেকর্ডটি পেতে পারে না। ।


এসকিউএল 2005 এবং উপরে নির্মিত এই বৈশিষ্ট্য আছে। ROW_NUMBER () ফাংশন ব্যবহার করুন। এটি ওয়েব পৃষ্ঠাগুলির জন্য একটি << পূর্ববর্তী এবং পরবর্তী >> শৈলী ব্রাউজিংয়ের জন্য চমৎকার:

বাক্য গঠন:

SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
            *
        FROM
            Table_1
    ) sub
WHERE
    RowNum = 23

এখানে একটি স্প্রোকের জেনেরিক সংস্করণ যা আমি সম্প্রতি ওরাকলের জন্য লিখেছি যা গতিশীল পৃষ্ঠা / সাজানোর জন্য অনুমতি দেয় - এইচটিইউ

-- p_LowerBound = first row # in the returned set; if second page of 10 rows,
--                this would be 11 (-1 for unbounded/not set)
-- p_UpperBound = last row # in the returned set; if second page of 10 rows,
--                this would be 20 (-1 for unbounded/not set)

OPEN o_Cursor FOR
SELECT * FROM (
SELECT
    Column1,
    Column2
    rownum AS rn
FROM
(
    SELECT
        tbl.Column1,
        tbl.column2
    FROM MyTable tbl
    WHERE
        tbl.Column1 = p_PKParam OR
        tbl.Column1 = -1
    ORDER BY
        DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 1, Column1, 'X'),'X'),
        DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 1, Column1, 'X'),'X') DESC,
        DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate),
        DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate) DESC
))
WHERE
    (rn >= p_lowerBound OR p_lowerBound = -1) AND
    (rn <= p_upperBound OR p_upperBound = -1);

স্ট্যান্ডার্ডের ঐচ্ছিক অংশগুলিতে এটি করার উপায় রয়েছে, তবে অনেকগুলি ডাটাবেস এটি করার নিজস্ব উপায় সমর্থন করে।

এই এবং অন্যান্য বিষয় সম্পর্কে কথা বলা একটি সত্যিই ভাল সাইট http://troels.arvin.dk/db/rdbms/#select-limit

মূলত, PostgreSQL এবং MySQL অ-মানক সমর্থন করে:

SELECT...
LIMIT y OFFSET x 

ওরাকল, ডিবি 2 এবং এমএসকিউএল স্ট্যান্ডার্ড উইন্ডোং ফাংশনগুলিকে সমর্থন করে:

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
    columns
  FROM tablename
) AS foo
WHERE rownumber <= n

(যা আমি উপরের লিঙ্কযুক্ত সাইট থেকে কপি করেছি, যেহেতু আমি সেই ডিবি ব্যবহার করি না)

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

আপডেট: 2018-09-15 সংস্করণে 3.25.0 সংস্করণে SQLite যুক্ত উইন্ডো ফাংশন সমর্থন তাই উভয় ফর্ম SQLite এও কাজ করে।


টি-এসকিউএল - একটি টেবিল থেকে N'th RecordNumber নির্বাচন

select * from
 (select row_number() over (order by Rand() desc) as Rno,* from TableName) T where T.Rno = RecordNumber

Where  RecordNumber --> Record Number to Select
       TableName --> To be Replaced with your Table Name

উদাহরণস্বরূপ, একটি টেবিলের কর্মচারী থেকে 5 ম রেকর্ড নির্বাচন করতে, আপনার প্রশ্নটি হওয়া উচিত

select * from
 (select row_number() over (order by Rand() desc) as Rno,* from Employee) T where T.Rno = 5

LIMIT এন, 1 এমএস এসকিউএল সার্ভারে কাজ করে না। আমি মনে করি এটি শুধুমাত্র একমাত্র প্রধান ডাটাবেস যা সিনট্যাক্সকে সমর্থন করে না। ন্যায্য হতে, এটি এসকিউএল মানদণ্ডের অংশ নয়, যদিও এটি এত ব্যাপকভাবে সমর্থিত যে এটি হওয়া উচিত। এসকিউএল সার্ভার ছাড়া সব কিছুই LIMIT কাজ করে। এসকিউএল সার্ভারের জন্য, আমি একটি মার্জিত সমাধান খুঁজে পেতে সক্ষম হয়েছে না।


এসকিউএল সার্ভারে এটি যাচাই করুন:

Select top 10 * From emp 
EXCEPT
Select top 9 * From emp

এটি আপনাকে এমপি টেবিলের 10 তম সারি দেবে!


কিছুই না অভিনব, কোন বিশেষ ফাংশন, যদি আপনি Cache মত আমি ব্যবহার করি ...

SELECT TOP 1 * FROM (
  SELECT TOP n * FROM <table>
  ORDER BY ID Desc
)
ORDER BY ID ASC

আপনি একটি আইডি কলাম বা একটি datestamp কলাম আছে বিশ্বাস করে যে আপনি বিশ্বাস করতে পারেন।


SQL সার্ভার

শীর্ষ থেকে এন 'রেকর্ড নির্বাচন করুন

SELECT * FROM (
SELECT 
ID, NAME, ROW_NUMBER() OVER(ORDER BY ID) AS ROW
FROM TABLE 
) AS TMP 
WHERE ROW = n

নীচের থেকে রেকর্ড এন 'নির্বাচন করুন

SELECT * FROM (
SELECT 
ID, NAME, ROW_NUMBER() OVER(ORDER BY ID DESC) AS ROW
FROM TABLE 
) AS TMP 
WHERE ROW = n

এইভাবে আমি এটি DB2 SQL- এর মধ্যে করব, আমি বিশ্বাস করি RRN (আপেক্ষিক রেকর্ড নম্বর) ও / এস দ্বারা টেবিলের মধ্যে সংরক্ষণ করা হয়;

SELECT * FROM (                        
   SELECT RRN(FOO) AS RRN, FOO.*
   FROM FOO                         
   ORDER BY RRN(FOO)) BAR             
 WHERE BAR.RRN = recordnumber

এখানে আপনার বিভ্রান্তির একটি দ্রুত সমাধান।

SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1

এখানে আপনি N = 0 ভর্তি করে শেষ সারি পেতে পারেন, N = 1 দ্বারা দ্বিতীয় শেষ, N = 3 পূরণ করে চতুর্থ শেষ এবং আরও।

এই সাক্ষাত্কারের উপর খুব সাধারণ প্রশ্ন এবং এটি এর খুব সহজ উত্তর।

আরও যদি আপনি পরিমাণ, আইডি বা কিছু সংখ্যাসূচক সাজানোর আদেশ চান তবে আপনি MySQL এ CAST ফাংশনের জন্য যেতে পারেন।

SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1

এখানে এন = 4 পূরণ করে আপনি কার্ট টেবিল থেকে সর্বোচ্চ পরিমাণের পঞ্চম শেষ রেকর্ড পেতে সক্ষম হবেন। আপনি আপনার ক্ষেত্র এবং টেবিল নাম মাপসই করতে পারেন এবং সমাধান সঙ্গে আসা।


উত্তরগুলির কিছু দাবির বিপরীতে, এসকিউএল মানক এই বিষয় সম্পর্কে নীরব নয়।

যেহেতু SQL: 2003, আপনি সারিগুলি এড়িয়ে যেতে এবং ফলাফল সেট সীমাবদ্ধ করতে "উইন্ডো ফাংশন" ব্যবহার করতে সক্ষম হয়েছে।

এবং এসকিউএল: ২008 সালে, সামান্য সহজ পদ্ধতি ব্যবহার করা হয়েছে
OFFSET skip ROWS FETCH FIRST n ROWS ONLY

ব্যক্তিগতভাবে, আমি মনে করি না এসকিউএল: ২008 এর সংযোজন সত্যিই প্রয়োজন ছিল, তাই যদি আমি আইএসও হতাম, তবে আমি এটি একটি বৃহৎ মানদণ্ডের বাইরে রাখতাম।





postgresql