এসকিউএল সার্ভার সর্বশেষ এন সারি নির্বাচন করুন


139

এটি একটি পরিচিত প্রশ্ন তবে আমি যে সেরা সমাধানটি পেয়েছি তা হ'ল এরকম:

SELECT TOP N *
FROM MyTable
ORDER BY Id DESC

আমি প্রচুর সারি সহ একটি টেবিল পেয়েছি। এই ক্যোয়ারীটি ব্যবহার করা কোনও ধনাত্মকতা নয় কারণ এতে প্রচুর সময় লাগে। সুতরাং আমি অর্ডার বাই ব্যবহার না করে শেষ এন সারিগুলি নির্বাচন করতে কীভাবে পারি?

সম্পাদনা

এর দুঃখিত সদৃশ প্রশ্ন এই এক


"শেষ এন" বলতে কী বোঝায়? অর্ডার ব্যতীত, "শেষ এন" তেমন বোঝাপড়া করে না। যদি আপনার অর্থ "শেষ এন sertedোকানো হবে" তবে আপনি এটি দেওয়ার জন্য আপনি এসকিউএল সার্ভারের উপর নির্ভর করতে পারবেন না - আপনাকে অবশ্যই ধারা দ্বারা অর্ডার ব্যবহার করতে হবে।
ড্যানিয়েল রেনশওয়া

@ ড্যানিয়েল রেনশওয়া: এসকিউএল সার্ভারকে সমস্ত টেবিল অর্ডার করতে বাধ্য না করে টেবিলের শেষ এনটি কারণ এটি সত্যই ধীর হয়ে যায়
ডিয়েগো

আপনার প্রশ্নের ক্যোয়ারী হয় সবচেয়ে ভালো উপায়। যদি idসূচকযুক্ত হয় তবে এটি কেবল সূচকটিকে বিপরীতে স্ক্যান করবে এবং প্রথম 5 টি সারি পরে থামবে। যদি এটি সূচকযুক্ত না হয় তবে এটির জন্য TOP Nবাছাই করা দরকার। এটি করার অন্য কোনও পদ্ধতির চেয়ে খারাপ হবে না। এটি পুরো টেবিলটি বাছাই করে না (যদিও এটি পুরো টেবিলটি স্ক্যান করতে হবে)
মার্টিন স্মিথ

উত্তর:


38

আপনি পার্টিশন বৈশিষ্ট্য দ্বারাও সারি নম্বর ব্যবহার করে এটি করতে পারেন। একটি দুর্দান্ত উদাহরণ এখানে পাওয়া যাবে :

আমি নর্থওয়াইন্ড ডাটাবেসের অর্ডার সারণীটি ব্যবহার করছি ... এখন আসুন আমরা কর্মচারী 5 দ্বারা দেওয়া সর্বশেষ 5 টি আদেশ পুনরুদ্ধার করুন:

SELECT ORDERID, CUSTOMERID, OrderDate
FROM
(
    SELECT ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY OrderDate DESC) AS OrderedDate,*
    FROM Orders
) as ordlist

WHERE ordlist.EmployeeID = 5
AND ordlist.OrderedDate <= 5


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

101

আপনি এই এসকিউএল ব্যবহার করে শেষ এন সারি নির্বাচন করতে এসকিউএল সার্ভার তৈরি করতে পারেন:

select * from tbl_name order by id desc limit N;

2
সংস্করণ সামঞ্জস্যতা সম্পর্কে?
ফ্র্যাক্টালাইস্ট

63
এটি এসকিউএল সার্ভারে কাজ করে না। একটি মাইএসকিউএল, পোস্টগ্রেএসকিউএল এবং এসকিউএলাইট বৈশিষ্ট্যের মতো মনে হচ্ছে।
টিম ফ্রিজেন

3
সমস্ত গণিত পণ্য অবশ্যই এসকিউএল সার্ভার হয়। আপনি যদি এমএস এসকিউএল সার্ভার সম্পর্কে কথা বলতে চান তবে এটির নাম রাখবেন না কেন?
gena2x

4
আমি বিভ্রান্ত, প্রশ্নটি জিজ্ঞাসা করে যে "অর্ডার বাই ব্যবহার না করে" কীভাবে একটি নির্বাচিত ক্যোয়ারী তৈরি করবেন এবং আপনার উত্তরের নির্বাচিত প্রশ্নের সাথে "অর্ডার বাই" রয়েছে। এটি কি "অর্ডার বাই" দ্বারা "বাই" অর্ডার কোনও ধরণের?
রবার্ট সিনক্লেয়ার

5
@ gena2x এই প্রশ্নটি এসকিউএল সার্ভার ট্যাগ করেছে। এই ট্যাগটি মাইক্রোসফ্ট এসকিউএল সার্ভারকে বোঝায়।
মার্টিন স্মিথ

51

আমি জোনভিডির কোডটি পরীক্ষা করে দেখেছি তবে এটি খুব ধীর ছিল 6 এস।

এই কোডটি 0 সেকেন্ড নিয়েছে।

SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate    
FROM Orders where EmployeeID=5    
Order By OrderDate DESC

4
কত সারি ?? যখন আপনি অনেকগুলি সারি পেয়ে গেছেন যা সত্যই ধীর হতে পারে
ডিয়েগো

@ ডিগো এই কেন? যদি আপনি OrderDateসূচিকৃত হয়ে থাকেন তবে কোনও প্রশ্নের প্রথম বা শেষ এন সারি বাছাই করা মূলত সমান দ্রুত হওয়া উচিত । আমি বুঝতে পারি OrderDateযে orderোকানো অর্ডার করার জন্য একটি সুযোগের সাথে খুব ভাল সম্পর্ক রয়েছে, তবে এটি সর্বোত্তম দিকের একটি পার্শ্ব প্রতিক্রিয়া এবং এখনও একটি টেবিল স্ক্যান দরকার, না? (এবং আমি মনে করি না যে এটি ওপি তাদের প্রশ্নের আরও ভাল
শব্দযুক্ত ডুপ

1
@ ডিয়েগো - আপনি কেন বিশ্বাস করেন যে আপনি যে উত্তরটি গ্রহণ করেছেন সেটির চেয়ে এটি ধীর হবে?
মার্টিন স্মিথ 12

2
এটি সারিগুলিকে উল্টো দিকে ফিরিয়ে দেয়। তারপরে মূল ক্রমটি ফিরে পেতে আপনাকে তাদের দ্বারা পুনরায় অর্ডার করতে হবে।
চিহ্নিত করুন

15

আপনি যদি কোনও টেবিল থেকে সারিগুলির শেষ সংখ্যা নির্বাচন করতে চান।

সিনট্যাক্স যেমন হবে

 select * from table_name except select top 
 (numbers of rows - how many rows you want)* from table_name

এই বিবৃতিগুলি কিন্তু পৃথক পদ্ধতিতে কাজ করে। তোমাদেরকে ধন্যবাদ.

 select * from Products except select top (77-10) * from Products

এইভাবে আপনি শেষ 10 টি সারি পেতে পারেন তবে অর্ডারটি অবতরণ পদ্ধতিতে প্রদর্শিত হবে

select top 10 * from products
 order by productId desc 

 select * from products
 where productid in (select top 10 productID from products)
 order by productID desc

 select * from products where productID not in 
 (select top((select COUNT(*) from products ) -10 )productID from products)

7

খুব সাধারণ উপায়ে এবং এসকিউএল সার্ভারটি সমর্থন করার জন্য এখানে

SELECT TOP(N) *
FROM tbl_name
ORDER BY tbl_id DESC

এবং পারফরম্যান্সের জন্য, এটি খারাপ নয় (সার্ভার মেশিনে 10,000 এর বেশি রেকর্ডের জন্য এক সেকেন্ডেরও কম)


1
ভাল 10'000 রেকর্ড কিছুই আপনার পারফরম্যান্স সম্পর্কে মনে করা উচিত যেখানে। আপনি যখন লক্ষ লক্ষ রেকর্ডের বিষয়ে কথা বলতে শুরু করেন তখন আপনি পারফরম্যান্স সম্পর্কে চিন্তাভাবনা শুরু করতে পারেন
Dom84

6

"আইডি" কি সূচিত হয়? যদি তা না হয় তবে এটি করা একটি গুরুত্বপূর্ণ কাজ (আমি সন্দেহ করি এটি ইতিমধ্যে সূচকযুক্ত)।

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


6

প্রথমে আপনি সবচেয়ে রেকর্ড গণনা পান

 Declare @TableRowsCount Int
 select @TableRowsCount= COUNT(*) from <Your_Table>

এবং তারপর :

এসকিউএল সার্ভারে 2012

SELECT *
FROM  <Your_Table> As L
ORDER BY L.<your Field>
OFFSET <@TableRowsCount-@N> ROWS
FETCH NEXT @N ROWS ONLY;

এসকিউএল সার্ভার ২০০৮-এ

SELECT *
FROM 
(
SELECT ROW_NUMBER() OVER(ORDER BY ID) AS sequencenumber, *
FROM  <Your_Table>
    Order By <your Field>
) AS TempTable
WHERE sequencenumber > @TableRowsCount-@N 

4

এখানে কিছু না দিয়ে আপনি চেষ্টা করতে পারেন order byতবে আমি মনে করি এটির প্রতিটি সারিটি অনন্য। Nআপনি যে সারির সংখ্যাটি চান তা Lহ'ল টেবিলের সারি সংখ্যা।

select * from tbl_name except select top L-N * from tbl_name

পূর্বে উল্লিখিত হিসাবে, কোন সারিগুলি ফিরে আসে তা নির্ধারিত।

সম্পাদনা: এটি আসলে কুকুরের গতি সত্যিই কোন মূল্য।


4
select * from (select top 6 * from vwTable order by Hours desc) T order by Hours

2

এই ক্যোয়ারীটি সঠিক ক্রমে সর্বশেষ এন সারিগুলি ফেরত দেয় তবে এর কার্য সম্পাদন খুব কম

select *
from (
    select top N *
    from TableName t
    order by t.[Id] desc
) as temp
order by temp.[Id]

2

শেষ মানগুলি পেতে ক্যোয়ারির শেষে অর্ডারবাই সহ ডেস্ক ব্যবহার করুন।


1

এটি প্রশ্নের উপযুক্ত উপযুক্ত নাও হতে পারে, তবে ...

অফস্ট ক্লজ

OFFSET numberদফা আপনি একটি উপর লাফালাফি করা সম্ভব সংখ্যা সারির এবং তারপর যে পরে সারি ফিরে যান।

এই ডক লিঙ্কটি পোস্টগ্রিসের সাথে; আমি জানিনা এটি সাইবাজ / এমএস এসকিউএল সার্ভারে প্রযোজ্য কিনা।


1
DECLARE @MYVAR  NVARCHAR(100)
DECLARE @step  int
SET @step = 0;


DECLARE MYTESTCURSOR CURSOR
DYNAMIC 
FOR
SELECT col FROM [dbo].[table]
OPEN MYTESTCURSOR
FETCH LAST FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;


WHILE @step < 10
BEGIN   
    FETCH PRIOR FROM MYTESTCURSOR INTO @MYVAR
        print @MYVAR;
        SET @step = @step + 1;
END   
CLOSE MYTESTCURSOR
DEALLOCATE MYTESTCURSOR

1

এমএস টি-স্কেলে লিমিটেড সমর্থন করে না। বেশিরভাগ সময় আমি কেবলমাত্র MAX (আইডি) পাই এবং তার পরে বিয়োগ করি।

select * from ORDERS where ID >(select MAX(ID)-10 from ORDERS)

আইডি অনুক্রমিক না হলে এটি 10 ​​টিরও কম রেকর্ড ফেরত আসবে।


0

আমি সবচেয়ে বড় সারণীতে সর্বাধিক সাম্প্রতিকতম সারিগুলির ক্যোয়ারী ব্যবহার করার একটি কৌশল (100+ মিলিয়ন বা 1+ বিলিয়ন সারি) ক্যোয়ারীটি কেবলমাত্র সাম্প্রতিক "এন" শতাংশের সাম্প্রতিকতম "এন" শতাংশে সীমাবদ্ধ করে দিচ্ছে। এটি বাস্তব বিশ্বের অ্যাপ্লিকেশন, উদাহরণস্বরূপ আমি অ-historicতিহাসিক সাম্প্রতিক আবহাওয়া ডেটা, বা সাম্প্রতিক নিউজ ফিড অনুসন্ধান বা সাম্প্রতিক জিপিএস অবস্থানের ডেটা পয়েন্ট ডেটার জন্য এটি করি।

এটি যদি আপনার সারিগুলি সারণীর সর্বাধিক সাম্প্রতিক শীর্ষ 5% এ থাকে তবে আপনি যদি জানেন যে এটি একটি বিশাল পারফরম্যান্স উন্নতি । যেমন টেবিলগুলিতে সূচী রয়েছে এমনকি, এটি আরও সম্ভাব্য সারণিগুলিতে সারণির 5% সীমাতে সীমাবদ্ধ করে যা 100+ মিলিয়ন বা 1+ বিলিয়ন সারি রয়েছে। এটি বিশেষত ক্ষেত্রে হয় যখন ওল্ড ডেটাতে কেবল শারীরিক ডিস্ক পাঠ করা প্রয়োজন এবং কেবলমাত্র লজিক্যাল ইন মেমরির পাঠ্য নয়।

এটি নির্বাচন শীর্ষের চেয়ে আরও দক্ষ পার্কেন্ট | সীমাটি এটি সারিগুলি নির্বাচন করে না বলে সীমাবদ্ধ করে তবে কেবল অনুসন্ধানের জন্য ডেটার অংশটিকে সীমাবদ্ধ করে।

DECLARE @RowIdTableA BIGINT
DECLARE @RowIdTableB BIGINT
DECLARE @TopPercent FLOAT

-- Given that there is an Sequential Identity Column
-- Limit query to only rows in the most recent TOP 5% of rows
SET @TopPercent = .05
SELECT @RowIdTableA = (MAX(TableAId) - (MAX(TableAId) * @TopPercent)) FROM TableA
SELECT @RowIdTableB = (MAX(TableBId) - (MAX(TableBId) * @TopPercent)) FROM TableB

SELECT *
FROM TableA a
INNER JOIN TableB b ON a.KeyId = b.KeyId
WHERE a.Id > @RowIdTableA AND b.Id > @RowIdTableB AND
      a.SomeOtherCriteria = 'Whatever'

-1

ব্যবহার না করে শেষ 3 টি সারি প্রদর্শন করতে order by:

select * from Lms_Books_Details where Book_Code not in 
 (select top((select COUNT(*) from Lms_Books_Details ) -3 ) book_code from Lms_Books_Details) 

1
এটি অনুমানযোগ্য ফলাফল সরবরাহ করবে না। এসকিএল সার্ভার এমএসডিএন ডকস অনুসারে (এমএসডিএন.মিকোসফেসওটকম /en-us/library/ms189463.aspx ): "টপ অর্ডার বাই দফার সাথে একত্রে ব্যবহৃত হয়, ফলাফল সেট আদেশের প্রথম এন সংখ্যায় সীমাবদ্ধ থাকে সারি; অন্যথায়, এটি একটি অনির্ধারিত ক্রমে প্রথম এন সংখ্যার সারি দেয়। "
ক্যাভম্যান_ডিক

-1

EXCEPTবাক্য গঠন ব্যবহার করার চেষ্টা করুন ।
এটার মতো কিছু:

   SELECT * 
    FROM   clientDetails 
    EXCEPT 
    (SELECT TOP (numbers of rows - how many rows you want) * 
     FROM   clientDetails) 

@ প্রফুল্ল সূত্রধর হিসাবে একই উত্তর
ডিএমকে

-1

হতে পারে কিছুটা দেরী, তবে এখানে একটি সাধারণ নির্বাচন যা আপনার প্রশ্নের সমাধান করে।

SELECT * FROM "TABLE" T ORDER BY "T.ID_TABLE" DESC LIMIT 5;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.